Hi David,

some minor nits.

Could this driver be split into more files. 8k lines per file
is quite a lot. Although GCC might optimize it best this way :-)

David Miller schrieb:
> +#define nr64(reg)            readq(np->regs + (reg))
> +#define nw64(reg, val)               writeq((val), np->regs + (reg))
> +
> +#define nr64_mac(reg)                readq(np->mac_regs + (reg))
> +#define nw64_mac(reg, val)   writeq((val), np->mac_regs + (reg))
> +
> +#define nr64_ipp(reg)                readq(np->regs + np->ipp_off + (reg))
> +#define nw64_ipp(reg, val)   writeq((val), np->regs + np->ipp_off + (reg))
> +
> +#define nr64_pcs(reg)                readq(np->regs + np->pcs_off + (reg))
> +#define nw64_pcs(reg, val)   writeq((val), np->regs + np->pcs_off + (reg))
> +
> +#define nr64_xpcs(reg)               readq(np->regs + np->xpcs_off + (reg))
> +#define nw64_xpcs(reg, val)  writeq((val), np->regs + np->xpcs_off + (reg))

Can these be static inline and get the "struct niu *np" passed?

> +#define niu_lock_parent(np, flags) \
> +     spin_lock_irqsave(&np->parent->lock, flags)
> +#define niu_unlock_parent(np, flags) \
> +     spin_unlock_irqrestore(&np->parent->lock, flags)

Maybe fold that into its callers.

> +static int serdes_init_10g(struct niu *np)
> +{
> +     struct niu_link_config *lp = &np->link_config;
> +     unsigned long ctrl_reg, test_cfg_reg, i;
> +     u64 ctrl_val, test_cfg_val, sig, mask, val;
> +     int err;
> +
> +     switch (np->port) {
> +     case 0:
> +             ctrl_reg = ENET_SERDES_0_CTRL_CFG;
> +             test_cfg_reg = ENET_SERDES_0_TEST_CFG;
> +             break;
> +     case 1:
> +             ctrl_reg = ENET_SERDES_1_CTRL_CFG;
> +             test_cfg_reg = ENET_SERDES_1_TEST_CFG;
> +             break;
> +
> +     default:
> +             return -EINVAL;
> +     }


Maybe small table?

> +     ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
> +                 ENET_SERDES_CTRL_SDET_1 |
> +                 ENET_SERDES_CTRL_SDET_2 |
> +                 ENET_SERDES_CTRL_SDET_3 |
> +                 (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
> +                 (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
> +                 (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
> +                 (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
> +                 (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
> +                 (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
> +                 (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
> +                 (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
> +     test_cfg_val = 0;
> +
> +     if (lp->loopback_mode == LOOPBACK_PHY) {
> +             test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
> +                               ENET_SERDES_TEST_MD_0_SHIFT) |
> +                              (ENET_TEST_MD_PAD_LOOPBACK <<
> +                               ENET_SERDES_TEST_MD_1_SHIFT) |
> +                              (ENET_TEST_MD_PAD_LOOPBACK <<
> +                               ENET_SERDES_TEST_MD_2_SHIFT) |
> +                              (ENET_TEST_MD_PAD_LOOPBACK <<
> +                               ENET_SERDES_TEST_MD_3_SHIFT));
> +     }
> +
> +     nw64(ctrl_reg, ctrl_val);
> +     nw64(test_cfg_reg, test_cfg_val);
> +
> +     for (i = 0; i < 4; i++) {

why 4? (magic number)

> +             u32 rxtx_ctrl, glue0;
> +             int err;
> +
> +             err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
> +             if (err)
> +                     return err;
> +             err = esr_read_glue0(np, i, &glue0);
> +             if (err)
> +                     return err;
> +
> +             rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
> +             rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
> +                           (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
> +
> +             glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
> +                        ESR_GLUE_CTRL0_THCNT |
> +                        ESR_GLUE_CTRL0_BLTIME);
> +             glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
> +                       (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
> +                       (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
> +                       (BLTIME_300_CYCLES <<
> +                        ESR_GLUE_CTRL0_BLTIME_SHIFT));
> +
> +             err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
> +             if (err)
> +                     return err;
> +             err = esr_write_glue0(np, i, glue0);
> +             if (err)
> +                     return err;
> +     }
> +
> +     err = esr_reset(np);
> +     if (err)
> +             return err;
> +
> +     sig = nr64(ESR_INT_SIGNALS);
> +     switch (np->port) {
> +     case 0:
> +             mask = ESR_INT_SIGNALS_P0_BITS;
> +             val = (ESR_INT_SRDY0_P0 |
> +                    ESR_INT_DET0_P0 |
> +                    ESR_INT_XSRDY_P0 |
> +                    ESR_INT_XDP_P0_CH3 |
> +                    ESR_INT_XDP_P0_CH2 |
> +                    ESR_INT_XDP_P0_CH1 |
> +                    ESR_INT_XDP_P0_CH0);
> +             break;
> +
> +     case 1:
> +             mask = ESR_INT_SIGNALS_P1_BITS;
> +             val = (ESR_INT_SRDY0_P1 |
> +                    ESR_INT_DET0_P1 |
> +                    ESR_INT_XSRDY_P1 |
> +                    ESR_INT_XDP_P1_CH3 |
> +                    ESR_INT_XDP_P1_CH2 |
> +                    ESR_INT_XDP_P1_CH1 |
> +                    ESR_INT_XDP_P1_CH0);
> +             break;
> +
> +     default:
> +             return -EINVAL;
> +     }

maybe small table? (maybe combined with the other one suggsted above)

> +
> +     if ((sig & mask) != val) {
> +             printk(KERN_ERR PFX "Port %u signal bits [%08x] are not "
> +                    "[%08x]\n", np->port, (int) (sig & mask), (int) val);
> +             return -ENODEV;
> +     }
> +
> +     return 0;
> +}
> +
> +static int serdes_init_1g(struct niu *np)
> +{
> +     u64 val;
> +
> +     val = nr64(ENET_SERDES_1_PLL_CFG);
> +     val &= ~ENET_SERDES_PLL_FBDIV2;
> +     switch (np->port) {
> +     case 0:
> +             val |= ENET_SERDES_PLL_HRATE0;
> +             break;
> +     case 1:
> +             val |= ENET_SERDES_PLL_HRATE1;
> +             break;
> +     case 2:
> +             val |= ENET_SERDES_PLL_HRATE2;
> +             break;
> +     case 3:
> +             val |= ENET_SERDES_PLL_HRATE3;
> +             break;
> +     default:
> +             return -EINVAL;
> +     }

Maybe small table.

> +     nw64(ENET_SERDES_1_PLL_CFG, val);
> +
> +     return 0;
> +}
> +

[...]

> +static int bcm8704_init_user_dev3(struct niu *np)
> +{
> +     int err;
> +
> +     err = mdio_write(np, np->phy_addr,
> +                      BCM8704_USER_DEV3_ADDR, BCM8704_USER_CONTROL,
> +                      (USER_CONTROL_OPTXRST_LVL |
> +                       USER_CONTROL_OPBIASFLT_LVL |
> +                       USER_CONTROL_OBTMPFLT_LVL |
> +                       USER_CONTROL_OPPRFLT_LVL |
> +                       USER_CONTROL_OPTXFLT_LVL |
> +                       USER_CONTROL_OPRXLOS_LVL |
> +                       USER_CONTROL_OPRXFLT_LVL |
> +                       USER_CONTROL_OPTXON_LVL |
> +                       (0x3f << USER_CONTROL_RES1_SHIFT)));
> +     if (err)
> +             return err;
> +
> +     err = mdio_write(np, np->phy_addr,
> +                      BCM8704_USER_DEV3_ADDR, BCM8704_USER_PMD_TX_CONTROL,
> +                      (USER_PMD_TX_CTL_XFP_CLKEN |
> +                       (1 << USER_PMD_TX_CTL_TX_DAC_TXD_SH) |
> +                       (2 << USER_PMD_TX_CTL_TX_DAC_TXCK_SH) |
> +                       USER_PMD_TX_CTL_TSCK_LPWREN));
> +     if (err)
> +             return err;
> +
> +     err = bcm8704_user_dev3_readback(np, BCM8704_USER_CONTROL);
> +     if (err)
> +             return err;
> +     err = bcm8704_user_dev3_readback(np, BCM8704_USER_PMD_TX_CONTROL);
> +     if (err)
> +             return err;
> +
> +     err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
> +                     BCM8704_USER_OPT_DIGITAL_CTRL);
> +     if (err < 0)
> +             return err;
> +     err &= ~USER_ODIG_CTRL_GPIOS;
> +     err |= (0x3 << USER_ODIG_CTRL_GPIOS_SHIFT);
> +     err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
> +                      BCM8704_USER_OPT_DIGITAL_CTRL, err);
> +     if (err)
> +             return err;
> +
> +     udelay(1000000);

maybe convert to mdelay?

> +
> +     return 0;
> +}
> +

[...]

> +static void niu_init_xif(struct niu *);
> +
> +static int link_status_10g(struct niu *np, int *link_up_p)
> +{
> +     unsigned long flags;
> +     int err, link_up;
> +
> +     if (np->link_config.loopback_mode != LOOPBACK_DISABLED)
> +             return -EINVAL;
> +
> +     link_up = 0;
> +
> +     spin_lock_irqsave(&np->lock, flags);
> +
> +     err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
> +                     BCM8704_PMD_RCV_SIGDET);
> +     if (err < 0)
> +             return err;

missing spin_unlock_irqsave()?

> +     if (!(err & PMD_RCV_SIGDET_GLOBAL))
> +             goto out;
> +
> +     err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
> +                     BCM8704_PCS_10G_R_STATUS);
> +     if (err < 0)
> +             return err;
missing spin_unlock_irqsave()?

> +     if (!(err & PCS_10G_R_STATUS_BLK_LOCK))
> +             goto out;
> +
> +     err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
> +                     BCM8704_PHYXS_XGXS_LANE_STAT);
> +     if (err < 0)
> +             return err;
> +
> +     if (err != (PHYXS_XGXS_LANE_STAT_ALINGED |
> +                 PHYXS_XGXS_LANE_STAT_MAGIC |
> +                 PHYXS_XGXS_LANE_STAT_LANE3 |
> +                 PHYXS_XGXS_LANE_STAT_LANE2 |
> +                 PHYXS_XGXS_LANE_STAT_LANE1 |
> +                 PHYXS_XGXS_LANE_STAT_LANE0))
> +             goto out;
> +
> +     link_up = 1;
> +     np->link_config.active_speed = SPEED_10000;
> +     np->link_config.active_duplex = DUPLEX_FULL;
> +
> +out:
> +     spin_unlock_irqrestore(&np->lock, flags);
> +
> +     *link_up_p = link_up;
> +     return 0;
> +}

[...]

> +static void niu_set_primary_mac(struct niu *np, unsigned char *addr)
> +{
> +     u16 reg0 = addr[4] << 8 | addr[5];
> +     u16 reg1 = addr[2] << 8 | addr[3];
> +     u16 reg2 = addr[0] << 8 | addr[1];
> +
> +     if (np->flags & NIU_FLAGS_XMAC) {
> +             nw64_mac(XMAC_ADDR0, reg0);
> +             nw64_mac(XMAC_ADDR1, reg1);
> +             nw64_mac(XMAC_ADDR2, reg2);
> +     } else {
> +             nw64_mac(BMAC_ADDR0, reg0);
> +             nw64_mac(BMAC_ADDR1, reg1);
> +             nw64_mac(BMAC_ADDR2, reg2);
> +     }
> +}
> +
> +static int niu_num_alt_addr(struct niu *np)
static int niu_num_alt_addr(const struct niu *np)

> +{
> +     if (np->flags & NIU_FLAGS_XMAC)
> +             return XMAC_NUM_ALT_ADDR;
> +     else
> +             return BMAC_NUM_ALT_ADDR;
> +}
> +

[...]

> +static void niu_set_max_burst(struct niu *np, struct tx_ring_info *rp)
> +{
> +     int mtu = np->dev->mtu;
> +
> +     rp->max_burst = mtu + 32;
> +     if (rp->max_burst > 4096)
> +             rp->max_burst = 4096;

Why 32 and 4096? (Magic values)

> +}
> +

... ok, I stop here, since this drivers is damn big :-)

Best Regards

Ingo Oeser
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to