Lines Matching full: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()
150 #define niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \ argument
152 __niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
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()
189 #define niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \ argument
191 __niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
194 static int __niu_wait_bits_clear(struct niu *np, unsigned long reg, in __niu_wait_bits_clear() argument
209 #define niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY) \ argument
211 __niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY); \
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()
229 #define niu_set_and_wait_clear(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \ argument
231 __niu_set_and_wait_clear(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
234 static void niu_ldg_rearm(struct niu *np, struct niu_ldg *lp, int on) 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->private, 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->private, 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_locked(&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()
6120 niu_enable_napi(np); in niu_open()
6123 spin_lock_irq(&np->lock); in niu_open()
6125 err = niu_init_hw(np); in niu_open()
6127 timer_setup(&np->timer, niu_timer, 0); in niu_open()
6128 np->timer.expires = jiffies + HZ; in niu_open()
6130 err = niu_enable_interrupts(np, 1); in niu_open()
6132 niu_stop_hw(np); in niu_open()
6135 spin_unlock_irq(&np->lock); in niu_open()
6138 niu_disable_napi(np); in niu_open()
6144 if (np->link_config.loopback_mode != LOOPBACK_DISABLED) in niu_open()
6147 add_timer(&np->timer); in niu_open()
6152 niu_free_irq(np); in niu_open()
6155 niu_free_channels(np); in niu_open()
6161 static void niu_full_shutdown(struct niu *np, struct net_device *dev) in niu_full_shutdown() argument
6163 cancel_work_sync(&np->reset_task); in niu_full_shutdown()
6165 niu_disable_napi(np); in niu_full_shutdown()
6168 del_timer_sync(&np->timer); in niu_full_shutdown()
6170 spin_lock_irq(&np->lock); in niu_full_shutdown()
6172 niu_stop_hw(np); in niu_full_shutdown()
6174 spin_unlock_irq(&np->lock); in niu_full_shutdown()
6179 struct niu *np = netdev_priv(dev); in niu_close() local
6181 niu_full_shutdown(np, dev); in niu_close()
6183 niu_free_irq(np); in niu_close()
6185 niu_free_channels(np); in niu_close()
6187 niu_handle_led(np, 0); in niu_close()
6192 static void niu_sync_xmac_stats(struct niu *np) in niu_sync_xmac_stats() argument
6194 struct niu_xmac_stats *mp = &np->mac_stats.xmac; in niu_sync_xmac_stats()
6217 static void niu_sync_bmac_stats(struct niu *np) in niu_sync_bmac_stats() argument
6219 struct niu_bmac_stats *mp = &np->mac_stats.bmac; in niu_sync_bmac_stats()
6230 static void niu_sync_mac_stats(struct niu *np) in niu_sync_mac_stats() argument
6232 if (np->flags & NIU_FLAGS_XMAC) in niu_sync_mac_stats()
6233 niu_sync_xmac_stats(np); in niu_sync_mac_stats()
6235 niu_sync_bmac_stats(np); in niu_sync_mac_stats()
6238 static void niu_get_rx_stats(struct niu *np, in niu_get_rx_stats() argument
6247 rx_rings = READ_ONCE(np->rx_rings); in niu_get_rx_stats()
6251 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_rx_stats()
6254 niu_sync_rx_discard_stats(np, rp, 0); in niu_get_rx_stats()
6269 static void niu_get_tx_stats(struct niu *np, in niu_get_tx_stats() argument
6278 tx_rings = READ_ONCE(np->tx_rings); in niu_get_tx_stats()
6282 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_tx_stats()
6299 struct niu *np = netdev_priv(dev); in niu_get_stats() local
6302 niu_get_rx_stats(np, stats); in niu_get_stats()
6303 niu_get_tx_stats(np, stats); in niu_get_stats()
6307 static void niu_load_hash_xmac(struct niu *np, u16 *hash) in niu_load_hash_xmac() argument
6315 static void niu_load_hash_bmac(struct niu *np, u16 *hash) in niu_load_hash_bmac() argument
6323 static void niu_load_hash(struct niu *np, u16 *hash) in niu_load_hash() argument
6325 if (np->flags & NIU_FLAGS_XMAC) in niu_load_hash()
6326 niu_load_hash_xmac(np, hash); in niu_load_hash()
6328 niu_load_hash_bmac(np, hash); in niu_load_hash()
6333 struct niu *np = netdev_priv(dev); in niu_set_rx_mode() local
6339 spin_lock_irqsave(&np->lock, flags); in niu_set_rx_mode()
6340 niu_enable_rx_mac(np, 0); in niu_set_rx_mode()
6342 np->flags &= ~(NIU_FLAGS_MCAST | NIU_FLAGS_PROMISC); in niu_set_rx_mode()
6344 np->flags |= NIU_FLAGS_PROMISC; in niu_set_rx_mode()
6346 np->flags |= NIU_FLAGS_MCAST; in niu_set_rx_mode()
6349 if (alt_cnt > niu_num_alt_addr(np)) { in niu_set_rx_mode()
6351 np->flags |= NIU_FLAGS_PROMISC; in niu_set_rx_mode()
6358 err = niu_set_alt_mac(np, index, ha->addr); in niu_set_rx_mode()
6362 err = niu_enable_alt_mac(np, index, 1); in niu_set_rx_mode()
6371 if (np->flags & NIU_FLAGS_XMAC) in niu_set_rx_mode()
6375 for (i = alt_start; i < niu_num_alt_addr(np); i++) { in niu_set_rx_mode()
6376 err = niu_enable_alt_mac(np, i, 0); in niu_set_rx_mode()
6394 if (np->flags & NIU_FLAGS_MCAST) in niu_set_rx_mode()
6395 niu_load_hash(np, hash); in niu_set_rx_mode()
6397 niu_enable_rx_mac(np, 1); in niu_set_rx_mode()
6398 spin_unlock_irqrestore(&np->lock, flags); in niu_set_rx_mode()
6403 struct niu *np = netdev_priv(dev); in niu_set_mac_addr() local
6415 spin_lock_irqsave(&np->lock, flags); in niu_set_mac_addr()
6416 niu_enable_rx_mac(np, 0); in niu_set_mac_addr()
6417 niu_set_primary_mac(np, dev->dev_addr); in niu_set_mac_addr()
6418 niu_enable_rx_mac(np, 1); in niu_set_mac_addr()
6419 spin_unlock_irqrestore(&np->lock, flags); in niu_set_mac_addr()
6429 static void niu_netif_stop(struct niu *np) in niu_netif_stop() argument
6431 netif_trans_update(np->dev); /* prevent tx timeout */ in niu_netif_stop()
6433 niu_disable_napi(np); in niu_netif_stop()
6435 netif_tx_disable(np->dev); in niu_netif_stop()
6438 static void niu_netif_start(struct niu *np) in niu_netif_start() argument
6444 netif_tx_wake_all_queues(np->dev); in niu_netif_start()
6446 niu_enable_napi(np); in niu_netif_start()
6448 niu_enable_interrupts(np, 1); in niu_netif_start()
6451 static void niu_reset_buffers(struct niu *np) in niu_reset_buffers() argument
6455 if (np->rx_rings) { in niu_reset_buffers()
6456 for (i = 0; i < np->num_rx_rings; i++) { in niu_reset_buffers()
6457 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_reset_buffers()
6472 err = niu_rbr_add_page(np, rp, GFP_ATOMIC, k); in niu_reset_buffers()
6483 if (np->tx_rings) { in niu_reset_buffers()
6484 for (i = 0; i < np->num_tx_rings; i++) { in niu_reset_buffers()
6485 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_reset_buffers()
6489 (void) release_tx_packet(np, rp, j); in niu_reset_buffers()
6502 struct niu *np = container_of(work, struct niu, reset_task); in niu_reset_task() local
6506 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6507 if (!netif_running(np->dev)) { in niu_reset_task()
6508 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6512 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6514 del_timer_sync(&np->timer); in niu_reset_task()
6516 niu_netif_stop(np); in niu_reset_task()
6518 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6520 niu_stop_hw(np); in niu_reset_task()
6522 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6524 niu_reset_buffers(np); in niu_reset_task()
6526 netdev_lock(np->dev); in niu_reset_task()
6527 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6529 err = niu_init_hw(np); in niu_reset_task()
6531 np->timer.expires = jiffies + HZ; in niu_reset_task()
6532 add_timer(&np->timer); in niu_reset_task()
6533 niu_netif_start(np); in niu_reset_task()
6536 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6537 netdev_unlock(np->dev); in niu_reset_task()
6542 struct niu *np = netdev_priv(dev); in niu_tx_timeout() local
6544 dev_err(np->device, "%s: Transmit timed out, resetting\n", in niu_tx_timeout()
6547 schedule_work(&np->reset_task); in niu_tx_timeout()
6630 struct niu *np = netdev_priv(dev); in niu_start_xmit() local
6641 rp = &np->tx_rings[i]; in niu_start_xmit()
6646 dev_err(np->device, "%s: BUG! Tx ring full when queue awake!\n", dev->name); in niu_start_xmit()
6677 mapping = np->ops->map_single(np->device, skb->data, in niu_start_xmit()
6717 mapping = np->ops->map_page(np->device, skb_frag_page(frag), in niu_start_xmit()
6752 struct niu *np = netdev_priv(dev); in niu_change_mtu() local
6764 niu_full_shutdown(np, dev); in niu_change_mtu()
6766 niu_free_channels(np); in niu_change_mtu()
6769 niu_enable_napi(np); in niu_change_mtu()
6772 err = niu_alloc_channels(np); in niu_change_mtu()
6776 spin_lock_irq(&np->lock); in niu_change_mtu()
6778 err = niu_init_hw(np); in niu_change_mtu()
6780 timer_setup(&np->timer, niu_timer, 0); in niu_change_mtu()
6781 np->timer.expires = jiffies + HZ; in niu_change_mtu()
6783 err = niu_enable_interrupts(np, 1); in niu_change_mtu()
6785 niu_stop_hw(np); in niu_change_mtu()
6788 spin_unlock_irq(&np->lock); in niu_change_mtu()
6792 if (np->link_config.loopback_mode != LOOPBACK_DISABLED) in niu_change_mtu()
6795 add_timer(&np->timer); in niu_change_mtu()
6804 struct niu *np = netdev_priv(dev); in niu_get_drvinfo() local
6805 struct niu_vpd *vpd = &np->vpd; in niu_get_drvinfo()
6811 if (np->parent->plat_type != PLAT_TYPE_NIU) in niu_get_drvinfo()
6812 strscpy(info->bus_info, pci_name(np->pdev), in niu_get_drvinfo()
6819 struct niu *np = netdev_priv(dev); in niu_get_link_ksettings() local
6822 lp = &np->link_config; in niu_get_link_ksettings()
6825 cmd->base.phy_address = np->phy_addr; in niu_get_link_ksettings()
6833 cmd->base.port = (np->flags & NIU_FLAGS_FIBER) ? PORT_FIBRE : PORT_TP; in niu_get_link_ksettings()
6841 struct niu *np = netdev_priv(dev); in niu_set_link_ksettings() local
6842 struct niu_link_config *lp = &np->link_config; in niu_set_link_ksettings()
6849 return niu_init_link(np); in niu_set_link_ksettings()
6854 struct niu *np = netdev_priv(dev); in niu_get_msglevel() local
6855 return np->msg_enable; in niu_get_msglevel()
6860 struct niu *np = netdev_priv(dev); in niu_set_msglevel() local
6861 np->msg_enable = value; in niu_set_msglevel()
6866 struct niu *np = netdev_priv(dev); in niu_nway_reset() local
6868 if (np->link_config.autoneg) in niu_nway_reset()
6869 return niu_init_link(np); in niu_nway_reset()
6876 struct niu *np = netdev_priv(dev); in niu_get_eeprom_len() local
6878 return np->eeprom_len; in niu_get_eeprom_len()
6884 struct niu *np = netdev_priv(dev); in niu_get_eeprom() local
6892 if (offset >= np->eeprom_len) in niu_get_eeprom()
6894 if (offset + len > np->eeprom_len) in niu_get_eeprom()
6895 len = eeprom->len = np->eeprom_len - offset; in niu_get_eeprom()
7080 static int niu_get_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc) in niu_get_hash_opts() argument
7089 if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] & in niu_get_hash_opts()
7093 nfc->data = niu_flowkey_to_ethflow(np->parent->flow_key[class - in niu_get_hash_opts()
7174 static int niu_get_ethtool_tcam_entry(struct niu *np, in niu_get_ethtool_tcam_entry() argument
7177 struct niu_parent *parent = np->parent; in niu_get_ethtool_tcam_entry()
7184 idx = tcam_get_index(np, (u16)nfc->fs.location); in niu_get_ethtool_tcam_entry()
7188 netdev_info(np->dev, "niu%d: entry [%d] invalid for idx[%d]\n", in niu_get_ethtool_tcam_entry()
7198 netdev_info(np->dev, "niu%d: niu_class_to_ethflow failed\n", in niu_get_ethtool_tcam_entry()
7248 nfc->data = tcam_get_size(np); in niu_get_ethtool_tcam_entry()
7253 static int niu_get_ethtool_tcam_all(struct niu *np, in niu_get_ethtool_tcam_all() argument
7257 struct niu_parent *parent = np->parent; in niu_get_ethtool_tcam_all()
7264 nfc->data = tcam_get_size(np); in niu_get_ethtool_tcam_all()
7266 niu_lock_parent(np, flags); in niu_get_ethtool_tcam_all()
7268 idx = tcam_get_index(np, i); in niu_get_ethtool_tcam_all()
7279 niu_unlock_parent(np, flags); in niu_get_ethtool_tcam_all()
7289 struct niu *np = netdev_priv(dev); in niu_get_nfc() local
7294 ret = niu_get_hash_opts(np, cmd); in niu_get_nfc()
7297 cmd->data = np->num_rx_rings; in niu_get_nfc()
7300 cmd->rule_cnt = tcam_get_valid_entry_cnt(np); in niu_get_nfc()
7303 ret = niu_get_ethtool_tcam_entry(np, cmd); in niu_get_nfc()
7306 ret = niu_get_ethtool_tcam_all(np, cmd, rule_locs); in niu_get_nfc()
7316 static int niu_set_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc) in niu_set_hash_opts() argument
7330 niu_lock_parent(np, flags); in niu_set_hash_opts()
7331 flow_key = np->parent->tcam_key[class - in niu_set_hash_opts()
7335 np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = flow_key; in niu_set_hash_opts()
7336 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7340 if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] & in niu_set_hash_opts()
7342 niu_lock_parent(np, flags); in niu_set_hash_opts()
7343 flow_key = np->parent->tcam_key[class - in niu_set_hash_opts()
7348 np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = in niu_set_hash_opts()
7350 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7357 niu_lock_parent(np, flags); in niu_set_hash_opts()
7359 np->parent->flow_key[class - CLASS_CODE_USER_PROG1] = flow_key; in niu_set_hash_opts()
7360 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7433 static int niu_add_ethtool_tcam_entry(struct niu *np, in niu_add_ethtool_tcam_entry() argument
7436 struct niu_parent *parent = np->parent; in niu_add_ethtool_tcam_entry()
7439 struct niu_rdc_tables *rdc_table = &parent->rdc_group_cfg[np->port]; in niu_add_ethtool_tcam_entry()
7449 if (idx >= tcam_get_size(np)) in niu_add_ethtool_tcam_entry()
7461 niu_lock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7490 ret = tcam_user_ip_class_set(np, class, 0, in niu_add_ethtool_tcam_entry()
7497 ret = tcam_user_ip_class_enable(np, class, 1); in niu_add_ethtool_tcam_entry()
7508 netdev_info(np->dev, "niu%d: %s(): Could not find/insert class for pid %d\n", in niu_add_ethtool_tcam_entry()
7513 niu_unlock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7520 niu_lock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7522 idx = tcam_get_index(np, idx); in niu_add_ethtool_tcam_entry()
7542 netdev_info(np->dev, "niu%d: In %s(): flow %d for IPv6 not implemented\n", in niu_add_ethtool_tcam_entry()
7550 netdev_info(np->dev, "niu%d: In %s(): Unknown flow type %d\n", in niu_add_ethtool_tcam_entry()
7560 if (fsp->ring_cookie >= np->num_rx_rings) { in niu_add_ethtool_tcam_entry()
7561 netdev_info(np->dev, "niu%d: In %s(): Invalid RX ring %lld\n", in niu_add_ethtool_tcam_entry()
7572 err = tcam_write(np, idx, tp->key, tp->key_mask); in niu_add_ethtool_tcam_entry()
7577 err = tcam_assoc_write(np, idx, tp->assoc_data); in niu_add_ethtool_tcam_entry()
7585 np->clas.tcam_valid_entries++; in niu_add_ethtool_tcam_entry()
7587 niu_unlock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7592 static int niu_del_ethtool_tcam_entry(struct niu *np, u32 loc) in niu_del_ethtool_tcam_entry() argument
7594 struct niu_parent *parent = np->parent; in niu_del_ethtool_tcam_entry()
7601 if (loc >= tcam_get_size(np)) in niu_del_ethtool_tcam_entry()
7604 niu_lock_parent(np, flags); in niu_del_ethtool_tcam_entry()
7606 idx = tcam_get_index(np, loc); in niu_del_ethtool_tcam_entry()
7620 ret = tcam_user_ip_class_enable(np, in niu_del_ethtool_tcam_entry()
7632 netdev_info(np->dev, "niu%d: In %s(): Usr class 0x%llx not found\n", in niu_del_ethtool_tcam_entry()
7640 ret = tcam_flush(np, idx); in niu_del_ethtool_tcam_entry()
7646 np->clas.tcam_valid_entries--; in niu_del_ethtool_tcam_entry()
7648 niu_unlock_parent(np, flags); in niu_del_ethtool_tcam_entry()
7655 struct niu *np = netdev_priv(dev); in niu_set_nfc() local
7660 ret = niu_set_hash_opts(np, cmd); in niu_set_nfc()
7663 ret = niu_add_ethtool_tcam_entry(np, cmd); in niu_set_nfc()
7666 ret = niu_del_ethtool_tcam_entry(np, cmd->fs.location); in niu_set_nfc()
7756 struct niu *np = netdev_priv(dev); in niu_get_strings() local
7762 if (np->flags & NIU_FLAGS_XMAC) { in niu_get_strings()
7771 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_strings()
7776 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_strings()
7785 struct niu *np = netdev_priv(dev); in niu_get_sset_count() local
7790 return (np->flags & NIU_FLAGS_XMAC ? in niu_get_sset_count()
7793 (np->num_rx_rings * NUM_RXCHAN_STAT_KEYS) + in niu_get_sset_count()
7794 (np->num_tx_rings * NUM_TXCHAN_STAT_KEYS); in niu_get_sset_count()
7800 struct niu *np = netdev_priv(dev); in niu_get_ethtool_stats() local
7803 niu_sync_mac_stats(np); in niu_get_ethtool_stats()
7804 if (np->flags & NIU_FLAGS_XMAC) { in niu_get_ethtool_stats()
7805 memcpy(data, &np->mac_stats.xmac, in niu_get_ethtool_stats()
7809 memcpy(data, &np->mac_stats.bmac, in niu_get_ethtool_stats()
7813 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_ethtool_stats()
7814 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_get_ethtool_stats()
7816 niu_sync_rx_discard_stats(np, rp, 0); in niu_get_ethtool_stats()
7825 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_ethtool_stats()
7826 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_get_ethtool_stats()
7836 static u64 niu_led_state_save(struct niu *np) in niu_led_state_save() argument
7838 if (np->flags & NIU_FLAGS_XMAC) in niu_led_state_save()
7844 static void niu_led_state_restore(struct niu *np, u64 val) in niu_led_state_restore() argument
7846 if (np->flags & NIU_FLAGS_XMAC) in niu_led_state_restore()
7852 static void niu_force_led(struct niu *np, int on) in niu_force_led() argument
7856 if (np->flags & NIU_FLAGS_XMAC) { in niu_force_led()
7876 struct niu *np = netdev_priv(dev); in niu_set_phys_id() local
7883 np->orig_led_state = niu_led_state_save(np); in niu_set_phys_id()
7887 niu_force_led(np, 1); in niu_set_phys_id()
7891 niu_force_led(np, 0); in niu_set_phys_id()
7895 niu_led_state_restore(np, np->orig_led_state); in niu_set_phys_id()
7919 static int niu_ldg_assign_ldn(struct niu *np, struct niu_parent *parent, in niu_ldg_assign_ldn() argument
7929 if (np->parent->plat_type == PLAT_TYPE_NIU) { in niu_ldg_assign_ldn()
7936 dev_err(np->device, "Port %u, mismatched LDG assignment for ldn %d, should be %d is %llu\n", in niu_ldg_assign_ldn()
7937 np->port, ldn, ldg, in niu_ldg_assign_ldn()
7947 static int niu_set_ldg_timer_res(struct niu *np, int res) in niu_set_ldg_timer_res() argument
7958 static int niu_set_ldg_sid(struct niu *np, int ldg, int func, int vector) in niu_set_ldg_sid() argument
7970 static int niu_pci_eeprom_read(struct niu *np, u32 addr) in niu_pci_eeprom_read() argument
7989 dev_err(np->device, "EEPROM read timeout frame[%llx]\n", in niu_pci_eeprom_read()
8004 dev_err(np->device, "EEPROM read timeout frame[%llx]\n", in niu_pci_eeprom_read()
8013 static int niu_pci_eeprom_read16(struct niu *np, u32 off) in niu_pci_eeprom_read16() argument
8015 int err = niu_pci_eeprom_read(np, off); in niu_pci_eeprom_read16()
8021 err = niu_pci_eeprom_read(np, off + 1); in niu_pci_eeprom_read16()
8029 static int niu_pci_eeprom_read16_swp(struct niu *np, u32 off) in niu_pci_eeprom_read16_swp() argument
8031 int err = niu_pci_eeprom_read(np, off); in niu_pci_eeprom_read16_swp()
8038 err = niu_pci_eeprom_read(np, off + 1); in niu_pci_eeprom_read16_swp()
8047 static int niu_pci_vpd_get_propname(struct niu *np, u32 off, char *namebuf, in niu_pci_vpd_get_propname() argument
8053 int err = niu_pci_eeprom_read(np, off + i); in niu_pci_vpd_get_propname()
8066 static void niu_vpd_parse_version(struct niu *np) in niu_vpd_parse_version() argument
8068 struct niu_vpd *vpd = &np->vpd; in niu_vpd_parse_version()
8083 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_vpd_parse_version()
8089 np->flags |= NIU_FLAGS_VPD_VALID; in niu_vpd_parse_version()
8093 static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end) in niu_pci_vpd_scan_props() argument
8104 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_vpd_scan_props()
8113 niu_vpd_parse_version(np); in niu_pci_vpd_scan_props()
8117 err = niu_pci_eeprom_read(np, start + 2); in niu_pci_vpd_scan_props()
8123 prop_len = niu_pci_eeprom_read(np, start + 4); in niu_pci_vpd_scan_props()
8126 err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64); in niu_pci_vpd_scan_props()
8133 prop_buf = np->vpd.model; in niu_pci_vpd_scan_props()
8137 prop_buf = np->vpd.board_model; in niu_pci_vpd_scan_props()
8141 prop_buf = np->vpd.version; in niu_pci_vpd_scan_props()
8145 prop_buf = np->vpd.local_mac; in niu_pci_vpd_scan_props()
8149 prop_buf = &np->vpd.mac_num; in niu_pci_vpd_scan_props()
8153 prop_buf = np->vpd.phy_type; in niu_pci_vpd_scan_props()
8159 dev_err(np->device, "Property '%s' length (%d) is too long\n", namebuf, prop_len); in niu_pci_vpd_scan_props()
8167 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_vpd_scan_props()
8171 err = niu_pci_eeprom_read(np, off + i); in niu_pci_vpd_scan_props()
8185 static int niu_pci_vpd_fetch(struct niu *np, u32 start) in niu_pci_vpd_fetch() argument
8190 err = niu_pci_eeprom_read16_swp(np, start + 1); in niu_pci_vpd_fetch()
8200 err = niu_pci_eeprom_read(np, here); in niu_pci_vpd_fetch()
8206 err = niu_pci_eeprom_read16_swp(np, here + 1); in niu_pci_vpd_fetch()
8215 err = niu_pci_vpd_scan_props(np, here, end); in niu_pci_vpd_fetch()
8226 static u32 niu_pci_vpd_offset(struct niu *np) in niu_pci_vpd_offset() argument
8235 err = niu_pci_eeprom_read16(np, start + 0); in niu_pci_vpd_offset()
8240 err = niu_pci_eeprom_read16(np, start + 23); in niu_pci_vpd_offset()
8246 err = niu_pci_eeprom_read16(np, start + 0); in niu_pci_vpd_offset()
8249 err = niu_pci_eeprom_read16(np, start + 2); in niu_pci_vpd_offset()
8254 err = niu_pci_eeprom_read(np, start + 20); in niu_pci_vpd_offset()
8258 err = niu_pci_eeprom_read(np, ret + 2); in niu_pci_vpd_offset()
8266 err = niu_pci_eeprom_read16_swp(np, start + 8); in niu_pci_vpd_offset()
8271 err = niu_pci_eeprom_read(np, ret + 0); in niu_pci_vpd_offset()
8281 static int niu_phy_type_prop_decode(struct niu *np, const char *phy_prop) in niu_phy_type_prop_decode() argument
8285 np->flags &= ~(NIU_FLAGS_FIBER | in niu_phy_type_prop_decode()
8287 np->mac_xcvr = MAC_XCVR_MII; in niu_phy_type_prop_decode()
8290 np->flags |= (NIU_FLAGS_10G | in niu_phy_type_prop_decode()
8292 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8295 np->flags &= ~NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8296 np->flags |= NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8297 np->mac_xcvr = MAC_XCVR_PCS; in niu_phy_type_prop_decode()
8300 np->flags |= NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8301 np->flags &= ~NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8302 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8305 np->flags |= NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8306 np->flags &= ~NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8307 np->flags |= NIU_FLAGS_XCVR_SERDES; in niu_phy_type_prop_decode()
8308 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8315 static int niu_pci_vpd_get_nports(struct niu *np) in niu_pci_vpd_get_nports() argument
8319 if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) || in niu_pci_vpd_get_nports()
8320 (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) || in niu_pci_vpd_get_nports()
8321 (!strcmp(np->vpd.model, NIU_MARAMBA_MDL_STR)) || in niu_pci_vpd_get_nports()
8322 (!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) || in niu_pci_vpd_get_nports()
8323 (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR))) { in niu_pci_vpd_get_nports()
8325 } else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) || in niu_pci_vpd_get_nports()
8326 (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) || in niu_pci_vpd_get_nports()
8327 (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) || in niu_pci_vpd_get_nports()
8328 (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) { in niu_pci_vpd_get_nports()
8335 static void niu_pci_vpd_validate(struct niu *np) in niu_pci_vpd_validate() argument
8337 struct net_device *dev = np->dev; in niu_pci_vpd_validate()
8338 struct niu_vpd *vpd = &np->vpd; in niu_pci_vpd_validate()
8343 dev_err(np->device, "VPD MAC invalid, falling back to SPROM\n"); in niu_pci_vpd_validate()
8345 np->flags &= ~NIU_FLAGS_VPD_VALID; in niu_pci_vpd_validate()
8349 if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || in niu_pci_vpd_validate()
8350 !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { in niu_pci_vpd_validate()
8351 np->flags |= NIU_FLAGS_10G; in niu_pci_vpd_validate()
8352 np->flags &= ~NIU_FLAGS_FIBER; in niu_pci_vpd_validate()
8353 np->flags |= NIU_FLAGS_XCVR_SERDES; in niu_pci_vpd_validate()
8354 np->mac_xcvr = MAC_XCVR_PCS; in niu_pci_vpd_validate()
8355 if (np->port > 1) { in niu_pci_vpd_validate()
8356 np->flags |= NIU_FLAGS_FIBER; in niu_pci_vpd_validate()
8357 np->flags &= ~NIU_FLAGS_10G; in niu_pci_vpd_validate()
8359 if (np->flags & NIU_FLAGS_10G) in niu_pci_vpd_validate()
8360 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_vpd_validate()
8361 } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { in niu_pci_vpd_validate()
8362 np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | in niu_pci_vpd_validate()
8364 } else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { in niu_pci_vpd_validate()
8365 dev_err(np->device, "Illegal phy string [%s]\n", in niu_pci_vpd_validate()
8366 np->vpd.phy_type); in niu_pci_vpd_validate()
8367 dev_err(np->device, "Falling back to SPROM\n"); in niu_pci_vpd_validate()
8368 np->flags &= ~NIU_FLAGS_VPD_VALID; in niu_pci_vpd_validate()
8375 addr[5] += np->port; in niu_pci_vpd_validate()
8382 static int niu_pci_probe_sprom(struct niu *np) in niu_pci_probe_sprom() argument
8384 struct net_device *dev = np->dev; in niu_pci_probe_sprom()
8394 np->eeprom_len = len; in niu_pci_probe_sprom()
8396 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8407 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8410 dev_err(np->device, "Bad SPROM checksum (%x, should be 0xab)\n", (int)(sum & 0xff)); in niu_pci_probe_sprom()
8415 switch (np->port) { in niu_pci_probe_sprom()
8433 dev_err(np->device, "Bogus port number %u\n", in niu_pci_probe_sprom()
8434 np->port); in niu_pci_probe_sprom()
8437 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8443 np->flags &= ~(NIU_FLAGS_FIBER | in niu_pci_probe_sprom()
8445 np->mac_xcvr = MAC_XCVR_MII; in niu_pci_probe_sprom()
8450 np->flags &= ~NIU_FLAGS_10G; in niu_pci_probe_sprom()
8451 np->flags |= NIU_FLAGS_FIBER; in niu_pci_probe_sprom()
8452 np->mac_xcvr = MAC_XCVR_PCS; in niu_pci_probe_sprom()
8457 np->flags |= NIU_FLAGS_10G; in niu_pci_probe_sprom()
8458 np->flags &= ~NIU_FLAGS_FIBER; in niu_pci_probe_sprom()
8459 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_probe_sprom()
8464 np->flags |= (NIU_FLAGS_10G | in niu_pci_probe_sprom()
8466 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_probe_sprom()
8470 dev_err(np->device, "Bogus SPROM phy type %u\n", val8); in niu_pci_probe_sprom()
8475 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8483 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8489 dev_err(np->device, "SPROM MAC address invalid [ %pM ]\n", in niu_pci_probe_sprom()
8495 addr[5] += np->port; in niu_pci_probe_sprom()
8502 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8510 np->vpd.model[i + 3] = (tmp >> 0) & 0xff; in niu_pci_probe_sprom()
8511 np->vpd.model[i + 2] = (tmp >> 8) & 0xff; in niu_pci_probe_sprom()
8512 np->vpd.model[i + 1] = (tmp >> 16) & 0xff; in niu_pci_probe_sprom()
8513 np->vpd.model[i + 0] = (tmp >> 24) & 0xff; in niu_pci_probe_sprom()
8515 np->vpd.model[val] = '\0'; in niu_pci_probe_sprom()
8518 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8526 np->vpd.board_model[i + 3] = (tmp >> 0) & 0xff; in niu_pci_probe_sprom()
8527 np->vpd.board_model[i + 2] = (tmp >> 8) & 0xff; in niu_pci_probe_sprom()
8528 np->vpd.board_model[i + 1] = (tmp >> 16) & 0xff; in niu_pci_probe_sprom()
8529 np->vpd.board_model[i + 0] = (tmp >> 24) & 0xff; in niu_pci_probe_sprom()
8531 np->vpd.board_model[val] = '\0'; in niu_pci_probe_sprom()
8533 np->vpd.mac_num = in niu_pci_probe_sprom()
8535 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8536 "SPROM: NUM_PORTS_MACS[%d]\n", np->vpd.mac_num); in niu_pci_probe_sprom()
8541 static int niu_get_and_validate_port(struct niu *np) in niu_get_and_validate_port() argument
8543 struct niu_parent *parent = np->parent; in niu_get_and_validate_port()
8545 if (np->port <= 1) in niu_get_and_validate_port()
8546 np->flags |= NIU_FLAGS_XMAC; in niu_get_and_validate_port()
8552 parent->num_ports = niu_pci_vpd_get_nports(np); in niu_get_and_validate_port()
8569 if (np->port >= parent->num_ports) in niu_get_and_validate_port()
8777 static int fill_phy_probe_info(struct niu *np, struct niu_parent *parent, in fill_phy_probe_info() argument
8786 niu_lock_parent(np, flags); in fill_phy_probe_info()
8791 dev_id_1 = mdio_read(np, port, in fill_phy_probe_info()
8793 dev_id_2 = mdio_read(np, port, in fill_phy_probe_info()
8799 dev_id_1 = mdio_read(np, port, in fill_phy_probe_info()
8801 dev_id_2 = mdio_read(np, port, in fill_phy_probe_info()
8807 dev_id_1 = mii_read(np, port, MII_PHYSID1); in fill_phy_probe_info()
8808 dev_id_2 = mii_read(np, port, MII_PHYSID2); in fill_phy_probe_info()
8814 niu_unlock_parent(np, flags); in fill_phy_probe_info()
8819 static int walk_phys(struct niu *np, struct niu_parent *parent) in walk_phys() argument
8829 if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || in walk_phys()
8830 !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { in walk_phys()
8839 } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { in walk_phys()
8845 } else if ((np->flags & NIU_FLAGS_XCVR_SERDES) && in walk_phys()
8848 if (np->flags & NIU_FLAGS_10G) { in walk_phys()
8856 err = fill_phy_probe_info(np, parent, info); in walk_phys()
8886 val = phy_encode(PORT_TYPE_10G, np->port); in walk_phys()
8948 static int niu_probe_ports(struct niu *np) in niu_probe_ports() argument
8950 struct niu_parent *parent = np->parent; in niu_probe_ports()
8954 err = walk_phys(np, parent); in niu_probe_ports()
8958 niu_set_ldg_timer_res(np, 2); in niu_probe_ports()
8960 niu_ldn_irq_enable(np, i, 0); in niu_probe_ports()
8969 static int niu_classifier_swstate_init(struct niu *np) in niu_classifier_swstate_init() argument
8971 struct niu_classifier *cp = &np->clas; in niu_classifier_swstate_init()
8973 cp->tcam_top = (u16) np->port; in niu_classifier_swstate_init()
8974 cp->tcam_sz = np->parent->tcam_num_entries / np->parent->num_ports; in niu_classifier_swstate_init()
8978 return fflp_early_init(np); in niu_classifier_swstate_init()
8981 static void niu_link_config_init(struct niu *np) in niu_link_config_init() argument
8983 struct niu_link_config *lp = &np->link_config; in niu_link_config_init()
9006 static int niu_init_mac_ipp_pcs_base(struct niu *np) in niu_init_mac_ipp_pcs_base() argument
9008 switch (np->port) { in niu_init_mac_ipp_pcs_base()
9010 np->mac_regs = np->regs + XMAC_PORT0_OFF; in niu_init_mac_ipp_pcs_base()
9011 np->ipp_off = 0x00000; in niu_init_mac_ipp_pcs_base()
9012 np->pcs_off = 0x04000; in niu_init_mac_ipp_pcs_base()
9013 np->xpcs_off = 0x02000; in niu_init_mac_ipp_pcs_base()
9017 np->mac_regs = np->regs + XMAC_PORT1_OFF; in niu_init_mac_ipp_pcs_base()
9018 np->ipp_off = 0x08000; in niu_init_mac_ipp_pcs_base()
9019 np->pcs_off = 0x0a000; in niu_init_mac_ipp_pcs_base()
9020 np->xpcs_off = 0x08000; in niu_init_mac_ipp_pcs_base()
9024 np->mac_regs = np->regs + BMAC_PORT2_OFF; in niu_init_mac_ipp_pcs_base()
9025 np->ipp_off = 0x04000; in niu_init_mac_ipp_pcs_base()
9026 np->pcs_off = 0x0e000; in niu_init_mac_ipp_pcs_base()
9027 np->xpcs_off = ~0UL; in niu_init_mac_ipp_pcs_base()
9031 np->mac_regs = np->regs + BMAC_PORT3_OFF; in niu_init_mac_ipp_pcs_base()
9032 np->ipp_off = 0x0c000; in niu_init_mac_ipp_pcs_base()
9033 np->pcs_off = 0x12000; in niu_init_mac_ipp_pcs_base()
9034 np->xpcs_off = ~0UL; in niu_init_mac_ipp_pcs_base()
9038 dev_err(np->device, "Port %u is invalid, cannot compute MAC block offset\n", np->port); in niu_init_mac_ipp_pcs_base()
9045 static void niu_try_msix(struct niu *np, u8 *ldg_num_map) in niu_try_msix() argument
9048 struct niu_parent *parent = np->parent; in niu_try_msix()
9049 struct pci_dev *pdev = np->pdev; in niu_try_msix()
9053 first_ldg = (NIU_NUM_LDG / parent->num_ports) * np->port; in niu_try_msix()
9057 num_irqs = (parent->rxchan_per_port[np->port] + in niu_try_msix()
9058 parent->txchan_per_port[np->port] + in niu_try_msix()
9059 (np->port == 0 ? 3 : 1)); in niu_try_msix()
9069 np->flags &= ~NIU_FLAGS_MSIX; in niu_try_msix()
9073 np->flags |= NIU_FLAGS_MSIX; in niu_try_msix()
9075 np->ldg[i].irq = msi_vec[i].vector; in niu_try_msix()
9076 np->num_ldg = num_irqs; in niu_try_msix()
9079 static int niu_n2_irq_init(struct niu *np, u8 *ldg_num_map) in niu_n2_irq_init() argument
9082 struct platform_device *op = np->op; in niu_n2_irq_init()
9092 np->ldg[i].irq = op->archdata.irqs[i]; in niu_n2_irq_init()
9095 np->num_ldg = op->archdata.num_irqs; in niu_n2_irq_init()
9103 static int niu_ldg_init(struct niu *np) in niu_ldg_init() argument
9105 struct niu_parent *parent = np->parent; in niu_ldg_init()
9111 np->num_ldg = 1; in niu_ldg_init()
9112 np->ldg[0].irq = np->dev->irq; in niu_ldg_init()
9114 err = niu_n2_irq_init(np, ldg_num_map); in niu_ldg_init()
9118 niu_try_msix(np, ldg_num_map); in niu_ldg_init()
9120 port = np->port; in niu_ldg_init()
9121 for (i = 0; i < np->num_ldg; i++) { in niu_ldg_init()
9122 struct niu_ldg *lp = &np->ldg[i]; in niu_ldg_init()
9124 netif_napi_add(np->dev, &lp->napi, niu_poll); in niu_ldg_init()
9126 lp->np = np; in niu_ldg_init()
9134 if (np->parent->plat_type != PLAT_TYPE_NIU) { in niu_ldg_init()
9135 err = niu_set_ldg_sid(np, lp->ldg_num, port, i); in niu_ldg_init()
9154 err = niu_ldg_assign_ldn(np, parent, ldg_num_map[ldg_rotor], in niu_ldg_init()
9160 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9164 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9171 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9174 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9181 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9192 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9198 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9207 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9213 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9220 static void niu_ldg_free(struct niu *np) in niu_ldg_free() argument
9222 if (np->flags & NIU_FLAGS_MSIX) in niu_ldg_free()
9223 pci_disable_msix(np->pdev); in niu_ldg_free()
9226 static int niu_get_of_props(struct niu *np) in niu_get_of_props() argument
9229 struct net_device *dev = np->dev; in niu_get_of_props()
9236 if (np->parent->plat_type == PLAT_TYPE_NIU) in niu_get_of_props()
9237 dp = np->op->dev.of_node; in niu_get_of_props()
9239 dp = pci_device_to_OF_node(np->pdev); in niu_get_of_props()
9250 strcpy(np->vpd.phy_type, phy_type); in niu_get_of_props()
9252 if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { in niu_get_of_props()
9254 dp, np->vpd.phy_type); in niu_get_of_props()
9278 strcpy(np->vpd.model, model); in niu_get_of_props()
9281 np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | in niu_get_of_props()
9291 static int niu_get_invariants(struct niu *np) in niu_get_invariants() argument
9296 err = niu_get_of_props(np); in niu_get_invariants()
9302 err = niu_init_mac_ipp_pcs_base(np); in niu_get_invariants()
9307 err = niu_get_and_validate_port(np); in niu_get_invariants()
9312 if (np->parent->plat_type == PLAT_TYPE_NIU) in niu_get_invariants()
9316 offset = niu_pci_vpd_offset(np); in niu_get_invariants()
9317 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_get_invariants()
9320 err = niu_pci_vpd_fetch(np, offset); in niu_get_invariants()
9326 if (np->flags & NIU_FLAGS_VPD_VALID) { in niu_get_invariants()
9327 niu_pci_vpd_validate(np); in niu_get_invariants()
9328 err = niu_get_and_validate_port(np); in niu_get_invariants()
9333 if (!(np->flags & NIU_FLAGS_VPD_VALID)) { in niu_get_invariants()
9334 err = niu_get_and_validate_port(np); in niu_get_invariants()
9337 err = niu_pci_probe_sprom(np); in niu_get_invariants()
9343 err = niu_probe_ports(np); in niu_get_invariants()
9347 niu_ldg_init(np); in niu_get_invariants()
9349 niu_classifier_swstate_init(np); in niu_get_invariants()
9350 niu_link_config_init(np); in niu_get_invariants()
9352 err = niu_determine_phy_disposition(np); in niu_get_invariants()
9354 err = niu_init_link(np); in niu_get_invariants()
9473 static struct niu_parent *niu_new_parent(struct niu *np, in niu_new_parent() argument
9537 static struct niu_parent *niu_get_parent(struct niu *np, in niu_get_parent() argument
9541 int port = np->port; in niu_get_parent()
9552 p = niu_new_parent(np, id, ptype); in niu_get_parent()
9560 &np->device->kobj, in niu_get_parent()
9563 p->ports[port] = np; in niu_get_parent()
9572 static void niu_put_parent(struct niu *np) in niu_put_parent() argument
9574 struct niu_parent *p = np->parent; in niu_put_parent()
9575 u8 port = np->port; in niu_put_parent()
9578 BUG_ON(!p || p->ports[port] != np); in niu_put_parent()
9580 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_put_parent()
9590 np->parent = NULL; in niu_put_parent()
9668 struct niu *np; in niu_alloc_and_init() local
9676 np = netdev_priv(dev); in niu_alloc_and_init()
9677 np->dev = dev; in niu_alloc_and_init()
9678 np->pdev = pdev; in niu_alloc_and_init()
9679 np->op = op; in niu_alloc_and_init()
9680 np->device = gen_dev; in niu_alloc_and_init()
9681 np->ops = ops; in niu_alloc_and_init()
9683 np->msg_enable = niu_debug; in niu_alloc_and_init()
9685 spin_lock_init(&np->lock); in niu_alloc_and_init()
9686 INIT_WORK(&np->reset_task, niu_reset_task); in niu_alloc_and_init()
9688 np->port = port; in niu_alloc_and_init()
9713 static void niu_device_announce(struct niu *np) in niu_device_announce() argument
9715 struct net_device *dev = np->dev; in niu_device_announce()
9719 if (np->parent->plat_type == PLAT_TYPE_ATCA_CP3220) { in niu_device_announce()
9722 (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), in niu_device_announce()
9723 (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), in niu_device_announce()
9724 (np->flags & NIU_FLAGS_FIBER ? "RGMII FIBER" : "SERDES"), in niu_device_announce()
9725 (np->mac_xcvr == MAC_XCVR_MII ? "MII" : in niu_device_announce()
9726 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), in niu_device_announce()
9727 np->vpd.phy_type); in niu_device_announce()
9731 (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), in niu_device_announce()
9732 (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), in niu_device_announce()
9733 (np->flags & NIU_FLAGS_FIBER ? "FIBER" : in niu_device_announce()
9734 (np->flags & NIU_FLAGS_XCVR_SERDES ? "SERDES" : in niu_device_announce()
9736 (np->mac_xcvr == MAC_XCVR_MII ? "MII" : in niu_device_announce()
9737 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), in niu_device_announce()
9738 np->vpd.phy_type); in niu_device_announce()
9753 struct niu *np; in niu_pci_init_one() local
9789 np = netdev_priv(dev); in niu_pci_init_one()
9796 np->parent = niu_get_parent(np, &parent_id, in niu_pci_init_one()
9798 if (!np->parent) { in niu_pci_init_one()
9824 np->regs = pci_ioremap_bar(pdev, 0); in niu_pci_init_one()
9825 if (!np->regs) { in niu_pci_init_one()
9842 err = niu_get_invariants(np); in niu_pci_init_one()
9857 niu_device_announce(np); in niu_pci_init_one()
9862 if (np->regs) { in niu_pci_init_one()
9863 iounmap(np->regs); in niu_pci_init_one()
9864 np->regs = NULL; in niu_pci_init_one()
9868 niu_put_parent(np); in niu_pci_init_one()
9887 struct niu *np = netdev_priv(dev); in niu_pci_remove_one() local
9890 if (np->regs) { in niu_pci_remove_one()
9891 iounmap(np->regs); in niu_pci_remove_one()
9892 np->regs = NULL; in niu_pci_remove_one()
9895 niu_ldg_free(np); in niu_pci_remove_one()
9897 niu_put_parent(np); in niu_pci_remove_one()
9908 struct niu *np = netdev_priv(dev); in niu_suspend() local
9914 flush_work(&np->reset_task); in niu_suspend()
9915 niu_netif_stop(np); in niu_suspend()
9917 del_timer_sync(&np->timer); in niu_suspend()
9919 spin_lock_irqsave(&np->lock, flags); in niu_suspend()
9920 niu_enable_interrupts(np, 0); in niu_suspend()
9921 spin_unlock_irqrestore(&np->lock, flags); in niu_suspend()
9925 spin_lock_irqsave(&np->lock, flags); in niu_suspend()
9926 niu_stop_hw(np); in niu_suspend()
9927 spin_unlock_irqrestore(&np->lock, flags); in niu_suspend()
9935 struct niu *np = netdev_priv(dev); in niu_resume() local
9944 spin_lock_irqsave(&np->lock, flags); in niu_resume()
9947 err = niu_init_hw(np); in niu_resume()
9949 np->timer.expires = jiffies + HZ; in niu_resume()
9950 add_timer(&np->timer); in niu_resume()
9951 niu_netif_start(np); in niu_resume()
9954 spin_unlock_irqrestore(&np->lock, flags); in niu_resume()
10033 struct niu *np; in niu_of_probe() local
10052 np = netdev_priv(dev); in niu_of_probe()
10057 np->parent = niu_get_parent(np, &parent_id, in niu_of_probe()
10059 if (!np->parent) { in niu_of_probe()
10066 np->regs = of_ioremap(&op->resource[1], 0, in niu_of_probe()
10069 if (!np->regs) { in niu_of_probe()
10075 np->vir_regs_1 = of_ioremap(&op->resource[2], 0, in niu_of_probe()
10078 if (!np->vir_regs_1) { in niu_of_probe()
10084 np->vir_regs_2 = of_ioremap(&op->resource[3], 0, in niu_of_probe()
10087 if (!np->vir_regs_2) { in niu_of_probe()
10095 err = niu_get_invariants(np); in niu_of_probe()
10110 niu_device_announce(np); in niu_of_probe()
10115 if (np->vir_regs_1) { in niu_of_probe()
10116 of_iounmap(&op->resource[2], np->vir_regs_1, in niu_of_probe()
10118 np->vir_regs_1 = NULL; in niu_of_probe()
10121 if (np->vir_regs_2) { in niu_of_probe()
10122 of_iounmap(&op->resource[3], np->vir_regs_2, in niu_of_probe()
10124 np->vir_regs_2 = NULL; in niu_of_probe()
10127 if (np->regs) { in niu_of_probe()
10128 of_iounmap(&op->resource[1], np->regs, in niu_of_probe()
10130 np->regs = NULL; in niu_of_probe()
10134 niu_put_parent(np); in niu_of_probe()
10148 struct niu *np = netdev_priv(dev); in niu_of_remove() local
10152 if (np->vir_regs_1) { in niu_of_remove()
10153 of_iounmap(&op->resource[2], np->vir_regs_1, in niu_of_remove()
10155 np->vir_regs_1 = NULL; in niu_of_remove()
10158 if (np->vir_regs_2) { in niu_of_remove()
10159 of_iounmap(&op->resource[3], np->vir_regs_2, in niu_of_remove()
10161 np->vir_regs_2 = NULL; in niu_of_remove()
10164 if (np->regs) { in niu_of_remove()
10165 of_iounmap(&op->resource[1], np->regs, in niu_of_remove()
10167 np->regs = NULL; in niu_of_remove()
10170 niu_ldg_free(np); in niu_of_remove()
10172 niu_put_parent(np); in niu_of_remove()