0001
0002
0003
0004 #include <asm/unaligned.h>
0005 #include <linux/mdio.h>
0006 #include <linux/module.h>
0007 #include <linux/fsl/enetc_mdio.h>
0008 #include <linux/of_platform.h>
0009 #include <linux/of_mdio.h>
0010 #include <linux/of_net.h>
0011 #include <linux/pcs-lynx.h>
0012 #include "enetc_ierb.h"
0013 #include "enetc_pf.h"
0014
0015 #define ENETC_DRV_NAME_STR "ENETC PF driver"
0016
0017 static void enetc_pf_get_primary_mac_addr(struct enetc_hw *hw, int si, u8 *addr)
0018 {
0019 u32 upper = __raw_readl(hw->port + ENETC_PSIPMAR0(si));
0020 u16 lower = __raw_readw(hw->port + ENETC_PSIPMAR1(si));
0021
0022 put_unaligned_le32(upper, addr);
0023 put_unaligned_le16(lower, addr + 4);
0024 }
0025
0026 static void enetc_pf_set_primary_mac_addr(struct enetc_hw *hw, int si,
0027 const u8 *addr)
0028 {
0029 u32 upper = get_unaligned_le32(addr);
0030 u16 lower = get_unaligned_le16(addr + 4);
0031
0032 __raw_writel(upper, hw->port + ENETC_PSIPMAR0(si));
0033 __raw_writew(lower, hw->port + ENETC_PSIPMAR1(si));
0034 }
0035
0036 static int enetc_pf_set_mac_addr(struct net_device *ndev, void *addr)
0037 {
0038 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0039 struct sockaddr *saddr = addr;
0040
0041 if (!is_valid_ether_addr(saddr->sa_data))
0042 return -EADDRNOTAVAIL;
0043
0044 eth_hw_addr_set(ndev, saddr->sa_data);
0045 enetc_pf_set_primary_mac_addr(&priv->si->hw, 0, saddr->sa_data);
0046
0047 return 0;
0048 }
0049
0050 static void enetc_set_vlan_promisc(struct enetc_hw *hw, char si_map)
0051 {
0052 u32 val = enetc_port_rd(hw, ENETC_PSIPVMR);
0053
0054 val &= ~ENETC_PSIPVMR_SET_VP(ENETC_VLAN_PROMISC_MAP_ALL);
0055 enetc_port_wr(hw, ENETC_PSIPVMR, ENETC_PSIPVMR_SET_VP(si_map) | val);
0056 }
0057
0058 static void enetc_enable_si_vlan_promisc(struct enetc_pf *pf, int si_idx)
0059 {
0060 pf->vlan_promisc_simap |= BIT(si_idx);
0061 enetc_set_vlan_promisc(&pf->si->hw, pf->vlan_promisc_simap);
0062 }
0063
0064 static void enetc_disable_si_vlan_promisc(struct enetc_pf *pf, int si_idx)
0065 {
0066 pf->vlan_promisc_simap &= ~BIT(si_idx);
0067 enetc_set_vlan_promisc(&pf->si->hw, pf->vlan_promisc_simap);
0068 }
0069
0070 static void enetc_set_isol_vlan(struct enetc_hw *hw, int si, u16 vlan, u8 qos)
0071 {
0072 u32 val = 0;
0073
0074 if (vlan)
0075 val = ENETC_PSIVLAN_EN | ENETC_PSIVLAN_SET_QOS(qos) | vlan;
0076
0077 enetc_port_wr(hw, ENETC_PSIVLANR(si), val);
0078 }
0079
0080 static int enetc_mac_addr_hash_idx(const u8 *addr)
0081 {
0082 u64 fold = __swab64(ether_addr_to_u64(addr)) >> 16;
0083 u64 mask = 0;
0084 int res = 0;
0085 int i;
0086
0087 for (i = 0; i < 8; i++)
0088 mask |= BIT_ULL(i * 6);
0089
0090 for (i = 0; i < 6; i++)
0091 res |= (hweight64(fold & (mask << i)) & 0x1) << i;
0092
0093 return res;
0094 }
0095
0096 static void enetc_reset_mac_addr_filter(struct enetc_mac_filter *filter)
0097 {
0098 filter->mac_addr_cnt = 0;
0099
0100 bitmap_zero(filter->mac_hash_table,
0101 ENETC_MADDR_HASH_TBL_SZ);
0102 }
0103
0104 static void enetc_add_mac_addr_em_filter(struct enetc_mac_filter *filter,
0105 const unsigned char *addr)
0106 {
0107
0108 ether_addr_copy(filter->mac_addr, addr);
0109 filter->mac_addr_cnt++;
0110 }
0111
0112 static void enetc_add_mac_addr_ht_filter(struct enetc_mac_filter *filter,
0113 const unsigned char *addr)
0114 {
0115 int idx = enetc_mac_addr_hash_idx(addr);
0116
0117
0118 __set_bit(idx, filter->mac_hash_table);
0119 filter->mac_addr_cnt++;
0120 }
0121
0122 static void enetc_clear_mac_ht_flt(struct enetc_si *si, int si_idx, int type)
0123 {
0124 bool err = si->errata & ENETC_ERR_UCMCSWP;
0125
0126 if (type == UC) {
0127 enetc_port_wr(&si->hw, ENETC_PSIUMHFR0(si_idx, err), 0);
0128 enetc_port_wr(&si->hw, ENETC_PSIUMHFR1(si_idx), 0);
0129 } else {
0130 enetc_port_wr(&si->hw, ENETC_PSIMMHFR0(si_idx, err), 0);
0131 enetc_port_wr(&si->hw, ENETC_PSIMMHFR1(si_idx), 0);
0132 }
0133 }
0134
0135 static void enetc_set_mac_ht_flt(struct enetc_si *si, int si_idx, int type,
0136 unsigned long hash)
0137 {
0138 bool err = si->errata & ENETC_ERR_UCMCSWP;
0139
0140 if (type == UC) {
0141 enetc_port_wr(&si->hw, ENETC_PSIUMHFR0(si_idx, err),
0142 lower_32_bits(hash));
0143 enetc_port_wr(&si->hw, ENETC_PSIUMHFR1(si_idx),
0144 upper_32_bits(hash));
0145 } else {
0146 enetc_port_wr(&si->hw, ENETC_PSIMMHFR0(si_idx, err),
0147 lower_32_bits(hash));
0148 enetc_port_wr(&si->hw, ENETC_PSIMMHFR1(si_idx),
0149 upper_32_bits(hash));
0150 }
0151 }
0152
0153 static void enetc_sync_mac_filters(struct enetc_pf *pf)
0154 {
0155 struct enetc_mac_filter *f = pf->mac_filter;
0156 struct enetc_si *si = pf->si;
0157 int i, pos;
0158
0159 pos = EMETC_MAC_ADDR_FILT_RES;
0160
0161 for (i = 0; i < MADDR_TYPE; i++, f++) {
0162 bool em = (f->mac_addr_cnt == 1) && (i == UC);
0163 bool clear = !f->mac_addr_cnt;
0164
0165 if (clear) {
0166 if (i == UC)
0167 enetc_clear_mac_flt_entry(si, pos);
0168
0169 enetc_clear_mac_ht_flt(si, 0, i);
0170 continue;
0171 }
0172
0173
0174 if (em) {
0175 int err;
0176
0177 enetc_clear_mac_ht_flt(si, 0, UC);
0178
0179 err = enetc_set_mac_flt_entry(si, pos, f->mac_addr,
0180 BIT(0));
0181 if (!err)
0182 continue;
0183
0184
0185 dev_warn(&si->pdev->dev, "fallback to HT filt (%d)\n",
0186 err);
0187 }
0188
0189
0190 if (i == UC)
0191 enetc_clear_mac_flt_entry(si, pos);
0192
0193 enetc_set_mac_ht_flt(si, 0, i, *f->mac_hash_table);
0194 }
0195 }
0196
0197 static void enetc_pf_set_rx_mode(struct net_device *ndev)
0198 {
0199 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0200 struct enetc_pf *pf = enetc_si_priv(priv->si);
0201 struct enetc_hw *hw = &priv->si->hw;
0202 bool uprom = false, mprom = false;
0203 struct enetc_mac_filter *filter;
0204 struct netdev_hw_addr *ha;
0205 u32 psipmr = 0;
0206 bool em;
0207
0208 if (ndev->flags & IFF_PROMISC) {
0209
0210 psipmr = ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0);
0211 uprom = true;
0212 mprom = true;
0213 } else if (ndev->flags & IFF_ALLMULTI) {
0214
0215 psipmr = ENETC_PSIPMR_SET_MP(0);
0216 mprom = true;
0217 }
0218
0219
0220 if (!uprom) {
0221
0222 filter = &pf->mac_filter[UC];
0223 enetc_reset_mac_addr_filter(filter);
0224
0225 em = (netdev_uc_count(ndev) == 1);
0226 netdev_for_each_uc_addr(ha, ndev) {
0227 if (em) {
0228 enetc_add_mac_addr_em_filter(filter, ha->addr);
0229 break;
0230 }
0231
0232 enetc_add_mac_addr_ht_filter(filter, ha->addr);
0233 }
0234 }
0235
0236 if (!mprom) {
0237
0238 filter = &pf->mac_filter[MC];
0239 enetc_reset_mac_addr_filter(filter);
0240
0241 netdev_for_each_mc_addr(ha, ndev) {
0242 if (!is_multicast_ether_addr(ha->addr))
0243 continue;
0244
0245 enetc_add_mac_addr_ht_filter(filter, ha->addr);
0246 }
0247 }
0248
0249 if (!uprom || !mprom)
0250
0251 enetc_sync_mac_filters(pf);
0252
0253 psipmr |= enetc_port_rd(hw, ENETC_PSIPMR) &
0254 ~(ENETC_PSIPMR_SET_UP(0) | ENETC_PSIPMR_SET_MP(0));
0255 enetc_port_wr(hw, ENETC_PSIPMR, psipmr);
0256 }
0257
0258 static void enetc_set_vlan_ht_filter(struct enetc_hw *hw, int si_idx,
0259 unsigned long hash)
0260 {
0261 enetc_port_wr(hw, ENETC_PSIVHFR0(si_idx), lower_32_bits(hash));
0262 enetc_port_wr(hw, ENETC_PSIVHFR1(si_idx), upper_32_bits(hash));
0263 }
0264
0265 static int enetc_vid_hash_idx(unsigned int vid)
0266 {
0267 int res = 0;
0268 int i;
0269
0270 for (i = 0; i < 6; i++)
0271 res |= (hweight8(vid & (BIT(i) | BIT(i + 6))) & 0x1) << i;
0272
0273 return res;
0274 }
0275
0276 static void enetc_sync_vlan_ht_filter(struct enetc_pf *pf, bool rehash)
0277 {
0278 int i;
0279
0280 if (rehash) {
0281 bitmap_zero(pf->vlan_ht_filter, ENETC_VLAN_HT_SIZE);
0282
0283 for_each_set_bit(i, pf->active_vlans, VLAN_N_VID) {
0284 int hidx = enetc_vid_hash_idx(i);
0285
0286 __set_bit(hidx, pf->vlan_ht_filter);
0287 }
0288 }
0289
0290 enetc_set_vlan_ht_filter(&pf->si->hw, 0, *pf->vlan_ht_filter);
0291 }
0292
0293 static int enetc_vlan_rx_add_vid(struct net_device *ndev, __be16 prot, u16 vid)
0294 {
0295 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0296 struct enetc_pf *pf = enetc_si_priv(priv->si);
0297 int idx;
0298
0299 __set_bit(vid, pf->active_vlans);
0300
0301 idx = enetc_vid_hash_idx(vid);
0302 if (!__test_and_set_bit(idx, pf->vlan_ht_filter))
0303 enetc_sync_vlan_ht_filter(pf, false);
0304
0305 return 0;
0306 }
0307
0308 static int enetc_vlan_rx_del_vid(struct net_device *ndev, __be16 prot, u16 vid)
0309 {
0310 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0311 struct enetc_pf *pf = enetc_si_priv(priv->si);
0312
0313 __clear_bit(vid, pf->active_vlans);
0314 enetc_sync_vlan_ht_filter(pf, true);
0315
0316 return 0;
0317 }
0318
0319 static void enetc_set_loopback(struct net_device *ndev, bool en)
0320 {
0321 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0322 struct enetc_hw *hw = &priv->si->hw;
0323 u32 reg;
0324
0325 reg = enetc_port_rd(hw, ENETC_PM0_IF_MODE);
0326 if (reg & ENETC_PM0_IFM_RG) {
0327
0328 reg = (reg & ~ENETC_PM0_IFM_RLP) |
0329 (en ? ENETC_PM0_IFM_RLP : 0);
0330 enetc_port_wr(hw, ENETC_PM0_IF_MODE, reg);
0331 } else {
0332
0333 reg = enetc_port_rd(hw, ENETC_PM0_CMD_CFG);
0334 reg = (reg & ~ENETC_PM0_CMD_XGLP) |
0335 (en ? ENETC_PM0_CMD_XGLP : 0);
0336 reg = (reg & ~ENETC_PM0_CMD_PHY_TX_EN) |
0337 (en ? ENETC_PM0_CMD_PHY_TX_EN : 0);
0338 enetc_port_wr(hw, ENETC_PM0_CMD_CFG, reg);
0339 enetc_port_wr(hw, ENETC_PM1_CMD_CFG, reg);
0340 }
0341 }
0342
0343 static int enetc_pf_set_vf_mac(struct net_device *ndev, int vf, u8 *mac)
0344 {
0345 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0346 struct enetc_pf *pf = enetc_si_priv(priv->si);
0347 struct enetc_vf_state *vf_state;
0348
0349 if (vf >= pf->total_vfs)
0350 return -EINVAL;
0351
0352 if (!is_valid_ether_addr(mac))
0353 return -EADDRNOTAVAIL;
0354
0355 vf_state = &pf->vf_state[vf];
0356 vf_state->flags |= ENETC_VF_FLAG_PF_SET_MAC;
0357 enetc_pf_set_primary_mac_addr(&priv->si->hw, vf + 1, mac);
0358 return 0;
0359 }
0360
0361 static int enetc_pf_set_vf_vlan(struct net_device *ndev, int vf, u16 vlan,
0362 u8 qos, __be16 proto)
0363 {
0364 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0365 struct enetc_pf *pf = enetc_si_priv(priv->si);
0366
0367 if (priv->si->errata & ENETC_ERR_VLAN_ISOL)
0368 return -EOPNOTSUPP;
0369
0370 if (vf >= pf->total_vfs)
0371 return -EINVAL;
0372
0373 if (proto != htons(ETH_P_8021Q))
0374
0375 return -EPROTONOSUPPORT;
0376
0377 enetc_set_isol_vlan(&priv->si->hw, vf + 1, vlan, qos);
0378 return 0;
0379 }
0380
0381 static int enetc_pf_set_vf_spoofchk(struct net_device *ndev, int vf, bool en)
0382 {
0383 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0384 struct enetc_pf *pf = enetc_si_priv(priv->si);
0385 u32 cfgr;
0386
0387 if (vf >= pf->total_vfs)
0388 return -EINVAL;
0389
0390 cfgr = enetc_port_rd(&priv->si->hw, ENETC_PSICFGR0(vf + 1));
0391 cfgr = (cfgr & ~ENETC_PSICFGR0_ASE) | (en ? ENETC_PSICFGR0_ASE : 0);
0392 enetc_port_wr(&priv->si->hw, ENETC_PSICFGR0(vf + 1), cfgr);
0393
0394 return 0;
0395 }
0396
0397 static int enetc_setup_mac_address(struct device_node *np, struct enetc_pf *pf,
0398 int si)
0399 {
0400 struct device *dev = &pf->si->pdev->dev;
0401 struct enetc_hw *hw = &pf->si->hw;
0402 u8 mac_addr[ETH_ALEN] = { 0 };
0403 int err;
0404
0405
0406 if (np) {
0407 err = of_get_mac_address(np, mac_addr);
0408 if (err == -EPROBE_DEFER)
0409 return err;
0410 }
0411
0412
0413 if (is_zero_ether_addr(mac_addr))
0414 enetc_pf_get_primary_mac_addr(hw, si, mac_addr);
0415
0416
0417 if (is_zero_ether_addr(mac_addr)) {
0418 eth_random_addr(mac_addr);
0419 dev_info(dev, "no MAC address specified for SI%d, using %pM\n",
0420 si, mac_addr);
0421 }
0422
0423 enetc_pf_set_primary_mac_addr(hw, si, mac_addr);
0424
0425 return 0;
0426 }
0427
0428 static int enetc_setup_mac_addresses(struct device_node *np,
0429 struct enetc_pf *pf)
0430 {
0431 int err, i;
0432
0433
0434 err = enetc_setup_mac_address(np, pf, 0);
0435 if (err)
0436 return err;
0437
0438 for (i = 0; i < pf->total_vfs; i++) {
0439 err = enetc_setup_mac_address(NULL, pf, i + 1);
0440 if (err)
0441 return err;
0442 }
0443
0444 return 0;
0445 }
0446
0447 static void enetc_port_assign_rfs_entries(struct enetc_si *si)
0448 {
0449 struct enetc_pf *pf = enetc_si_priv(si);
0450 struct enetc_hw *hw = &si->hw;
0451 int num_entries, vf_entries, i;
0452 u32 val;
0453
0454
0455 val = enetc_port_rd(hw, ENETC_PRFSCAPR);
0456 num_entries = ENETC_PRFSCAPR_GET_NUM_RFS(val);
0457 vf_entries = num_entries / (pf->total_vfs + 1);
0458
0459 for (i = 0; i < pf->total_vfs; i++)
0460 enetc_port_wr(hw, ENETC_PSIRFSCFGR(i + 1), vf_entries);
0461 enetc_port_wr(hw, ENETC_PSIRFSCFGR(0),
0462 num_entries - vf_entries * pf->total_vfs);
0463
0464
0465 enetc_port_wr(hw, ENETC_PRFSMR, ENETC_PRFSMR_RFSE);
0466 }
0467
0468 static void enetc_port_si_configure(struct enetc_si *si)
0469 {
0470 struct enetc_pf *pf = enetc_si_priv(si);
0471 struct enetc_hw *hw = &si->hw;
0472 int num_rings, i;
0473 u32 val;
0474
0475 val = enetc_port_rd(hw, ENETC_PCAPR0);
0476 num_rings = min(ENETC_PCAPR0_RXBDR(val), ENETC_PCAPR0_TXBDR(val));
0477
0478 val = ENETC_PSICFGR0_SET_TXBDR(ENETC_PF_NUM_RINGS);
0479 val |= ENETC_PSICFGR0_SET_RXBDR(ENETC_PF_NUM_RINGS);
0480
0481 if (unlikely(num_rings < ENETC_PF_NUM_RINGS)) {
0482 val = ENETC_PSICFGR0_SET_TXBDR(num_rings);
0483 val |= ENETC_PSICFGR0_SET_RXBDR(num_rings);
0484
0485 dev_warn(&si->pdev->dev, "Found %d rings, expected %d!\n",
0486 num_rings, ENETC_PF_NUM_RINGS);
0487
0488 num_rings = 0;
0489 }
0490
0491
0492 val |= ENETC_PSICFGR0_SIVC(ENETC_VLAN_TYPE_C | ENETC_VLAN_TYPE_S);
0493
0494 enetc_port_wr(hw, ENETC_PSICFGR0(0), val);
0495
0496 if (num_rings)
0497 num_rings -= ENETC_PF_NUM_RINGS;
0498
0499
0500 val = ENETC_PSICFGR0_SIVC(ENETC_VLAN_TYPE_C | ENETC_VLAN_TYPE_S);
0501 val |= ENETC_PSICFGR0_VTE | ENETC_PSICFGR0_SIVIE;
0502
0503 if (num_rings) {
0504 num_rings /= pf->total_vfs;
0505 val |= ENETC_PSICFGR0_SET_TXBDR(num_rings);
0506 val |= ENETC_PSICFGR0_SET_RXBDR(num_rings);
0507 }
0508
0509 for (i = 0; i < pf->total_vfs; i++)
0510 enetc_port_wr(hw, ENETC_PSICFGR0(i + 1), val);
0511
0512
0513 val = ENETC_PVCLCTR_OVTPIDL(ENETC_VLAN_TYPE_C | ENETC_VLAN_TYPE_S);
0514 enetc_port_wr(hw, ENETC_PVCLCTR, val);
0515
0516 enetc_port_wr(hw, ENETC_PSIVLANFMR, ENETC_PSIVLANFMR_VS);
0517 }
0518
0519 static void enetc_configure_port_mac(struct enetc_hw *hw)
0520 {
0521 int tc;
0522
0523 enetc_port_wr(hw, ENETC_PM0_MAXFRM,
0524 ENETC_SET_MAXFRM(ENETC_RX_MAXFRM_SIZE));
0525
0526 for (tc = 0; tc < 8; tc++)
0527 enetc_port_wr(hw, ENETC_PTCMSDUR(tc), ENETC_MAC_MAXFRM_SIZE);
0528
0529 enetc_port_wr(hw, ENETC_PM0_CMD_CFG, ENETC_PM0_CMD_PHY_TX_EN |
0530 ENETC_PM0_CMD_TXP | ENETC_PM0_PROMISC);
0531
0532 enetc_port_wr(hw, ENETC_PM1_CMD_CFG, ENETC_PM0_CMD_PHY_TX_EN |
0533 ENETC_PM0_CMD_TXP | ENETC_PM0_PROMISC);
0534
0535
0536
0537
0538
0539 enetc_port_wr(hw, ENETC_PM0_RX_FIFO, ENETC_PM0_RX_FIFO_VAL);
0540 }
0541
0542 static void enetc_mac_config(struct enetc_hw *hw, phy_interface_t phy_mode)
0543 {
0544 u32 val;
0545
0546 if (phy_interface_mode_is_rgmii(phy_mode)) {
0547 val = enetc_port_rd(hw, ENETC_PM0_IF_MODE);
0548 val &= ~(ENETC_PM0_IFM_EN_AUTO | ENETC_PM0_IFM_IFMODE_MASK);
0549 val |= ENETC_PM0_IFM_IFMODE_GMII | ENETC_PM0_IFM_RG;
0550 enetc_port_wr(hw, ENETC_PM0_IF_MODE, val);
0551 }
0552
0553 if (phy_mode == PHY_INTERFACE_MODE_USXGMII) {
0554 val = ENETC_PM0_IFM_FULL_DPX | ENETC_PM0_IFM_IFMODE_XGMII;
0555 enetc_port_wr(hw, ENETC_PM0_IF_MODE, val);
0556 }
0557 }
0558
0559 static void enetc_mac_enable(struct enetc_hw *hw, bool en)
0560 {
0561 u32 val = enetc_port_rd(hw, ENETC_PM0_CMD_CFG);
0562
0563 val &= ~(ENETC_PM0_TX_EN | ENETC_PM0_RX_EN);
0564 val |= en ? (ENETC_PM0_TX_EN | ENETC_PM0_RX_EN) : 0;
0565
0566 enetc_port_wr(hw, ENETC_PM0_CMD_CFG, val);
0567 enetc_port_wr(hw, ENETC_PM1_CMD_CFG, val);
0568 }
0569
0570 static void enetc_configure_port_pmac(struct enetc_hw *hw)
0571 {
0572 u32 temp;
0573
0574
0575 temp = enetc_port_rd(hw, ENETC_PFPMR);
0576 enetc_port_wr(hw, ENETC_PFPMR,
0577 temp | ENETC_PFPMR_PMACE | ENETC_PFPMR_MWLM);
0578
0579 temp = enetc_port_rd(hw, ENETC_MMCSR);
0580 enetc_port_wr(hw, ENETC_MMCSR, temp | ENETC_MMCSR_ME);
0581 }
0582
0583 static void enetc_configure_port(struct enetc_pf *pf)
0584 {
0585 u8 hash_key[ENETC_RSSHASH_KEY_SIZE];
0586 struct enetc_hw *hw = &pf->si->hw;
0587
0588 enetc_configure_port_pmac(hw);
0589
0590 enetc_configure_port_mac(hw);
0591
0592 enetc_port_si_configure(pf->si);
0593
0594
0595 get_random_bytes(hash_key, ENETC_RSSHASH_KEY_SIZE);
0596 enetc_set_rss_key(hw, hash_key);
0597
0598
0599 enetc_port_assign_rfs_entries(pf->si);
0600
0601
0602 pf->vlan_promisc_simap = ENETC_VLAN_PROMISC_MAP_ALL;
0603 enetc_set_vlan_promisc(hw, pf->vlan_promisc_simap);
0604
0605 enetc_port_wr(hw, ENETC_PSIPMR, 0);
0606
0607
0608 enetc_port_wr(hw, ENETC_PMR, ENETC_PMR_EN);
0609 }
0610
0611
0612 static u16 enetc_msg_pf_set_vf_primary_mac_addr(struct enetc_pf *pf,
0613 int vf_id)
0614 {
0615 struct enetc_vf_state *vf_state = &pf->vf_state[vf_id];
0616 struct enetc_msg_swbd *msg = &pf->rxmsg[vf_id];
0617 struct enetc_msg_cmd_set_primary_mac *cmd;
0618 struct device *dev = &pf->si->pdev->dev;
0619 u16 cmd_id;
0620 char *addr;
0621
0622 cmd = (struct enetc_msg_cmd_set_primary_mac *)msg->vaddr;
0623 cmd_id = cmd->header.id;
0624 if (cmd_id != ENETC_MSG_CMD_MNG_ADD)
0625 return ENETC_MSG_CMD_STATUS_FAIL;
0626
0627 addr = cmd->mac.sa_data;
0628 if (vf_state->flags & ENETC_VF_FLAG_PF_SET_MAC)
0629 dev_warn(dev, "Attempt to override PF set mac addr for VF%d\n",
0630 vf_id);
0631 else
0632 enetc_pf_set_primary_mac_addr(&pf->si->hw, vf_id + 1, addr);
0633
0634 return ENETC_MSG_CMD_STATUS_OK;
0635 }
0636
0637 void enetc_msg_handle_rxmsg(struct enetc_pf *pf, int vf_id, u16 *status)
0638 {
0639 struct enetc_msg_swbd *msg = &pf->rxmsg[vf_id];
0640 struct device *dev = &pf->si->pdev->dev;
0641 struct enetc_msg_cmd_header *cmd_hdr;
0642 u16 cmd_type;
0643
0644 *status = ENETC_MSG_CMD_STATUS_OK;
0645 cmd_hdr = (struct enetc_msg_cmd_header *)msg->vaddr;
0646 cmd_type = cmd_hdr->type;
0647
0648 switch (cmd_type) {
0649 case ENETC_MSG_CMD_MNG_MAC:
0650 *status = enetc_msg_pf_set_vf_primary_mac_addr(pf, vf_id);
0651 break;
0652 default:
0653 dev_err(dev, "command not supported (cmd_type: 0x%x)\n",
0654 cmd_type);
0655 }
0656 }
0657
0658 #ifdef CONFIG_PCI_IOV
0659 static int enetc_sriov_configure(struct pci_dev *pdev, int num_vfs)
0660 {
0661 struct enetc_si *si = pci_get_drvdata(pdev);
0662 struct enetc_pf *pf = enetc_si_priv(si);
0663 int err;
0664
0665 if (!num_vfs) {
0666 enetc_msg_psi_free(pf);
0667 kfree(pf->vf_state);
0668 pf->num_vfs = 0;
0669 pci_disable_sriov(pdev);
0670 } else {
0671 pf->num_vfs = num_vfs;
0672
0673 pf->vf_state = kcalloc(num_vfs, sizeof(struct enetc_vf_state),
0674 GFP_KERNEL);
0675 if (!pf->vf_state) {
0676 pf->num_vfs = 0;
0677 return -ENOMEM;
0678 }
0679
0680 err = enetc_msg_psi_init(pf);
0681 if (err) {
0682 dev_err(&pdev->dev, "enetc_msg_psi_init (%d)\n", err);
0683 goto err_msg_psi;
0684 }
0685
0686 err = pci_enable_sriov(pdev, num_vfs);
0687 if (err) {
0688 dev_err(&pdev->dev, "pci_enable_sriov err %d\n", err);
0689 goto err_en_sriov;
0690 }
0691 }
0692
0693 return num_vfs;
0694
0695 err_en_sriov:
0696 enetc_msg_psi_free(pf);
0697 err_msg_psi:
0698 kfree(pf->vf_state);
0699 pf->num_vfs = 0;
0700
0701 return err;
0702 }
0703 #else
0704 #define enetc_sriov_configure(pdev, num_vfs) (void)0
0705 #endif
0706
0707 static int enetc_pf_set_features(struct net_device *ndev,
0708 netdev_features_t features)
0709 {
0710 netdev_features_t changed = ndev->features ^ features;
0711 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0712 int err;
0713
0714 if (changed & NETIF_F_HW_TC) {
0715 err = enetc_set_psfp(ndev, !!(features & NETIF_F_HW_TC));
0716 if (err)
0717 return err;
0718 }
0719
0720 if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {
0721 struct enetc_pf *pf = enetc_si_priv(priv->si);
0722
0723 if (!!(features & NETIF_F_HW_VLAN_CTAG_FILTER))
0724 enetc_disable_si_vlan_promisc(pf, 0);
0725 else
0726 enetc_enable_si_vlan_promisc(pf, 0);
0727 }
0728
0729 if (changed & NETIF_F_LOOPBACK)
0730 enetc_set_loopback(ndev, !!(features & NETIF_F_LOOPBACK));
0731
0732 enetc_set_features(ndev, features);
0733
0734 return 0;
0735 }
0736
0737 static int enetc_pf_setup_tc(struct net_device *ndev, enum tc_setup_type type,
0738 void *type_data)
0739 {
0740 switch (type) {
0741 case TC_SETUP_QDISC_MQPRIO:
0742 return enetc_setup_tc_mqprio(ndev, type_data);
0743 case TC_SETUP_QDISC_TAPRIO:
0744 return enetc_setup_tc_taprio(ndev, type_data);
0745 case TC_SETUP_QDISC_CBS:
0746 return enetc_setup_tc_cbs(ndev, type_data);
0747 case TC_SETUP_QDISC_ETF:
0748 return enetc_setup_tc_txtime(ndev, type_data);
0749 case TC_SETUP_BLOCK:
0750 return enetc_setup_tc_psfp(ndev, type_data);
0751 default:
0752 return -EOPNOTSUPP;
0753 }
0754 }
0755
0756 static const struct net_device_ops enetc_ndev_ops = {
0757 .ndo_open = enetc_open,
0758 .ndo_stop = enetc_close,
0759 .ndo_start_xmit = enetc_xmit,
0760 .ndo_get_stats = enetc_get_stats,
0761 .ndo_set_mac_address = enetc_pf_set_mac_addr,
0762 .ndo_set_rx_mode = enetc_pf_set_rx_mode,
0763 .ndo_vlan_rx_add_vid = enetc_vlan_rx_add_vid,
0764 .ndo_vlan_rx_kill_vid = enetc_vlan_rx_del_vid,
0765 .ndo_set_vf_mac = enetc_pf_set_vf_mac,
0766 .ndo_set_vf_vlan = enetc_pf_set_vf_vlan,
0767 .ndo_set_vf_spoofchk = enetc_pf_set_vf_spoofchk,
0768 .ndo_set_features = enetc_pf_set_features,
0769 .ndo_eth_ioctl = enetc_ioctl,
0770 .ndo_setup_tc = enetc_pf_setup_tc,
0771 .ndo_bpf = enetc_setup_bpf,
0772 .ndo_xdp_xmit = enetc_xdp_xmit,
0773 };
0774
0775 static void enetc_pf_netdev_setup(struct enetc_si *si, struct net_device *ndev,
0776 const struct net_device_ops *ndev_ops)
0777 {
0778 struct enetc_ndev_priv *priv = netdev_priv(ndev);
0779
0780 SET_NETDEV_DEV(ndev, &si->pdev->dev);
0781 priv->ndev = ndev;
0782 priv->si = si;
0783 priv->dev = &si->pdev->dev;
0784 si->ndev = ndev;
0785
0786 priv->msg_enable = (NETIF_MSG_WOL << 1) - 1;
0787 ndev->netdev_ops = ndev_ops;
0788 enetc_set_ethtool_ops(ndev);
0789 ndev->watchdog_timeo = 5 * HZ;
0790 ndev->max_mtu = ENETC_MAX_MTU;
0791
0792 ndev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM |
0793 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
0794 NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_LOOPBACK |
0795 NETIF_F_HW_CSUM | NETIF_F_TSO | NETIF_F_TSO6;
0796 ndev->features = NETIF_F_HIGHDMA | NETIF_F_SG | NETIF_F_RXCSUM |
0797 NETIF_F_HW_VLAN_CTAG_TX |
0798 NETIF_F_HW_VLAN_CTAG_RX |
0799 NETIF_F_HW_CSUM | NETIF_F_TSO | NETIF_F_TSO6;
0800 ndev->vlan_features = NETIF_F_SG | NETIF_F_HW_CSUM |
0801 NETIF_F_TSO | NETIF_F_TSO6;
0802
0803 if (si->num_rss)
0804 ndev->hw_features |= NETIF_F_RXHASH;
0805
0806 ndev->priv_flags |= IFF_UNICAST_FLT;
0807
0808 if (si->hw_features & ENETC_SI_F_PSFP && !enetc_psfp_enable(priv)) {
0809 priv->active_offloads |= ENETC_F_QCI;
0810 ndev->features |= NETIF_F_HW_TC;
0811 ndev->hw_features |= NETIF_F_HW_TC;
0812 }
0813
0814
0815 enetc_load_primary_mac_addr(&si->hw, ndev);
0816 }
0817
0818 static int enetc_mdio_probe(struct enetc_pf *pf, struct device_node *np)
0819 {
0820 struct device *dev = &pf->si->pdev->dev;
0821 struct enetc_mdio_priv *mdio_priv;
0822 struct mii_bus *bus;
0823 int err;
0824
0825 bus = devm_mdiobus_alloc_size(dev, sizeof(*mdio_priv));
0826 if (!bus)
0827 return -ENOMEM;
0828
0829 bus->name = "Freescale ENETC MDIO Bus";
0830 bus->read = enetc_mdio_read;
0831 bus->write = enetc_mdio_write;
0832 bus->parent = dev;
0833 mdio_priv = bus->priv;
0834 mdio_priv->hw = &pf->si->hw;
0835 mdio_priv->mdio_base = ENETC_EMDIO_BASE;
0836 snprintf(bus->id, MII_BUS_ID_SIZE, "%s", dev_name(dev));
0837
0838 err = of_mdiobus_register(bus, np);
0839 if (err)
0840 return dev_err_probe(dev, err, "cannot register MDIO bus\n");
0841
0842 pf->mdio = bus;
0843
0844 return 0;
0845 }
0846
0847 static void enetc_mdio_remove(struct enetc_pf *pf)
0848 {
0849 if (pf->mdio)
0850 mdiobus_unregister(pf->mdio);
0851 }
0852
0853 static int enetc_imdio_create(struct enetc_pf *pf)
0854 {
0855 struct device *dev = &pf->si->pdev->dev;
0856 struct enetc_mdio_priv *mdio_priv;
0857 struct phylink_pcs *phylink_pcs;
0858 struct mdio_device *mdio_device;
0859 struct mii_bus *bus;
0860 int err;
0861
0862 bus = mdiobus_alloc_size(sizeof(*mdio_priv));
0863 if (!bus)
0864 return -ENOMEM;
0865
0866 bus->name = "Freescale ENETC internal MDIO Bus";
0867 bus->read = enetc_mdio_read;
0868 bus->write = enetc_mdio_write;
0869 bus->parent = dev;
0870 bus->phy_mask = ~0;
0871 mdio_priv = bus->priv;
0872 mdio_priv->hw = &pf->si->hw;
0873 mdio_priv->mdio_base = ENETC_PM_IMDIO_BASE;
0874 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-imdio", dev_name(dev));
0875
0876 err = mdiobus_register(bus);
0877 if (err) {
0878 dev_err(dev, "cannot register internal MDIO bus (%d)\n", err);
0879 goto free_mdio_bus;
0880 }
0881
0882 mdio_device = mdio_device_create(bus, 0);
0883 if (IS_ERR(mdio_device)) {
0884 err = PTR_ERR(mdio_device);
0885 dev_err(dev, "cannot create mdio device (%d)\n", err);
0886 goto unregister_mdiobus;
0887 }
0888
0889 phylink_pcs = lynx_pcs_create(mdio_device);
0890 if (!phylink_pcs) {
0891 mdio_device_free(mdio_device);
0892 err = -ENOMEM;
0893 dev_err(dev, "cannot create lynx pcs (%d)\n", err);
0894 goto unregister_mdiobus;
0895 }
0896
0897 pf->imdio = bus;
0898 pf->pcs = phylink_pcs;
0899
0900 return 0;
0901
0902 unregister_mdiobus:
0903 mdiobus_unregister(bus);
0904 free_mdio_bus:
0905 mdiobus_free(bus);
0906 return err;
0907 }
0908
0909 static void enetc_imdio_remove(struct enetc_pf *pf)
0910 {
0911 struct mdio_device *mdio_device;
0912
0913 if (pf->pcs) {
0914 mdio_device = lynx_get_mdio_device(pf->pcs);
0915 mdio_device_free(mdio_device);
0916 lynx_pcs_destroy(pf->pcs);
0917 }
0918 if (pf->imdio) {
0919 mdiobus_unregister(pf->imdio);
0920 mdiobus_free(pf->imdio);
0921 }
0922 }
0923
0924 static bool enetc_port_has_pcs(struct enetc_pf *pf)
0925 {
0926 return (pf->if_mode == PHY_INTERFACE_MODE_SGMII ||
0927 pf->if_mode == PHY_INTERFACE_MODE_2500BASEX ||
0928 pf->if_mode == PHY_INTERFACE_MODE_USXGMII);
0929 }
0930
0931 static int enetc_mdiobus_create(struct enetc_pf *pf, struct device_node *node)
0932 {
0933 struct device_node *mdio_np;
0934 int err;
0935
0936 mdio_np = of_get_child_by_name(node, "mdio");
0937 if (mdio_np) {
0938 err = enetc_mdio_probe(pf, mdio_np);
0939
0940 of_node_put(mdio_np);
0941 if (err)
0942 return err;
0943 }
0944
0945 if (enetc_port_has_pcs(pf)) {
0946 err = enetc_imdio_create(pf);
0947 if (err) {
0948 enetc_mdio_remove(pf);
0949 return err;
0950 }
0951 }
0952
0953 return 0;
0954 }
0955
0956 static void enetc_mdiobus_destroy(struct enetc_pf *pf)
0957 {
0958 enetc_mdio_remove(pf);
0959 enetc_imdio_remove(pf);
0960 }
0961
0962 static struct phylink_pcs *
0963 enetc_pl_mac_select_pcs(struct phylink_config *config, phy_interface_t iface)
0964 {
0965 struct enetc_pf *pf = phylink_to_enetc_pf(config);
0966
0967 return pf->pcs;
0968 }
0969
0970 static void enetc_pl_mac_config(struct phylink_config *config,
0971 unsigned int mode,
0972 const struct phylink_link_state *state)
0973 {
0974 struct enetc_pf *pf = phylink_to_enetc_pf(config);
0975
0976 enetc_mac_config(&pf->si->hw, state->interface);
0977 }
0978
0979 static void enetc_force_rgmii_mac(struct enetc_hw *hw, int speed, int duplex)
0980 {
0981 u32 old_val, val;
0982
0983 old_val = val = enetc_port_rd(hw, ENETC_PM0_IF_MODE);
0984
0985 if (speed == SPEED_1000) {
0986 val &= ~ENETC_PM0_IFM_SSP_MASK;
0987 val |= ENETC_PM0_IFM_SSP_1000;
0988 } else if (speed == SPEED_100) {
0989 val &= ~ENETC_PM0_IFM_SSP_MASK;
0990 val |= ENETC_PM0_IFM_SSP_100;
0991 } else if (speed == SPEED_10) {
0992 val &= ~ENETC_PM0_IFM_SSP_MASK;
0993 val |= ENETC_PM0_IFM_SSP_10;
0994 }
0995
0996 if (duplex == DUPLEX_FULL)
0997 val |= ENETC_PM0_IFM_FULL_DPX;
0998 else
0999 val &= ~ENETC_PM0_IFM_FULL_DPX;
1000
1001 if (val == old_val)
1002 return;
1003
1004 enetc_port_wr(hw, ENETC_PM0_IF_MODE, val);
1005 }
1006
1007 static void enetc_pl_mac_link_up(struct phylink_config *config,
1008 struct phy_device *phy, unsigned int mode,
1009 phy_interface_t interface, int speed,
1010 int duplex, bool tx_pause, bool rx_pause)
1011 {
1012 struct enetc_pf *pf = phylink_to_enetc_pf(config);
1013 u32 pause_off_thresh = 0, pause_on_thresh = 0;
1014 u32 init_quanta = 0, refresh_quanta = 0;
1015 struct enetc_hw *hw = &pf->si->hw;
1016 struct enetc_ndev_priv *priv;
1017 u32 rbmr, cmd_cfg;
1018 int idx;
1019
1020 priv = netdev_priv(pf->si->ndev);
1021
1022 if (pf->si->hw_features & ENETC_SI_F_QBV)
1023 enetc_sched_speed_set(priv, speed);
1024
1025 if (!phylink_autoneg_inband(mode) &&
1026 phy_interface_mode_is_rgmii(interface))
1027 enetc_force_rgmii_mac(hw, speed, duplex);
1028
1029
1030 for (idx = 0; idx < priv->num_rx_rings; idx++) {
1031 rbmr = enetc_rxbdr_rd(hw, idx, ENETC_RBMR);
1032
1033 if (tx_pause)
1034 rbmr |= ENETC_RBMR_CM;
1035 else
1036 rbmr &= ~ENETC_RBMR_CM;
1037
1038 enetc_rxbdr_wr(hw, idx, ENETC_RBMR, rbmr);
1039 }
1040
1041 if (tx_pause) {
1042
1043
1044
1045
1046
1047 init_quanta = 0xffff;
1048
1049
1050
1051
1052
1053 refresh_quanta = 0xffff / 2;
1054
1055
1056
1057
1058
1059 pause_on_thresh = 3 * ENETC_MAC_MAXFRM_SIZE;
1060 pause_off_thresh = 1 * ENETC_MAC_MAXFRM_SIZE;
1061 }
1062
1063 enetc_port_wr(hw, ENETC_PM0_PAUSE_QUANTA, init_quanta);
1064 enetc_port_wr(hw, ENETC_PM1_PAUSE_QUANTA, init_quanta);
1065 enetc_port_wr(hw, ENETC_PM0_PAUSE_THRESH, refresh_quanta);
1066 enetc_port_wr(hw, ENETC_PM1_PAUSE_THRESH, refresh_quanta);
1067 enetc_port_wr(hw, ENETC_PPAUONTR, pause_on_thresh);
1068 enetc_port_wr(hw, ENETC_PPAUOFFTR, pause_off_thresh);
1069
1070 cmd_cfg = enetc_port_rd(hw, ENETC_PM0_CMD_CFG);
1071
1072 if (rx_pause)
1073 cmd_cfg &= ~ENETC_PM0_PAUSE_IGN;
1074 else
1075 cmd_cfg |= ENETC_PM0_PAUSE_IGN;
1076
1077 enetc_port_wr(hw, ENETC_PM0_CMD_CFG, cmd_cfg);
1078 enetc_port_wr(hw, ENETC_PM1_CMD_CFG, cmd_cfg);
1079
1080 enetc_mac_enable(hw, true);
1081 }
1082
1083 static void enetc_pl_mac_link_down(struct phylink_config *config,
1084 unsigned int mode,
1085 phy_interface_t interface)
1086 {
1087 struct enetc_pf *pf = phylink_to_enetc_pf(config);
1088
1089 enetc_mac_enable(&pf->si->hw, false);
1090 }
1091
1092 static const struct phylink_mac_ops enetc_mac_phylink_ops = {
1093 .validate = phylink_generic_validate,
1094 .mac_select_pcs = enetc_pl_mac_select_pcs,
1095 .mac_config = enetc_pl_mac_config,
1096 .mac_link_up = enetc_pl_mac_link_up,
1097 .mac_link_down = enetc_pl_mac_link_down,
1098 };
1099
1100 static int enetc_phylink_create(struct enetc_ndev_priv *priv,
1101 struct device_node *node)
1102 {
1103 struct enetc_pf *pf = enetc_si_priv(priv->si);
1104 struct phylink *phylink;
1105 int err;
1106
1107 pf->phylink_config.dev = &priv->ndev->dev;
1108 pf->phylink_config.type = PHYLINK_NETDEV;
1109 pf->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
1110 MAC_10 | MAC_100 | MAC_1000 | MAC_2500FD;
1111
1112 __set_bit(PHY_INTERFACE_MODE_INTERNAL,
1113 pf->phylink_config.supported_interfaces);
1114 __set_bit(PHY_INTERFACE_MODE_SGMII,
1115 pf->phylink_config.supported_interfaces);
1116 __set_bit(PHY_INTERFACE_MODE_2500BASEX,
1117 pf->phylink_config.supported_interfaces);
1118 __set_bit(PHY_INTERFACE_MODE_USXGMII,
1119 pf->phylink_config.supported_interfaces);
1120 phy_interface_set_rgmii(pf->phylink_config.supported_interfaces);
1121
1122 phylink = phylink_create(&pf->phylink_config, of_fwnode_handle(node),
1123 pf->if_mode, &enetc_mac_phylink_ops);
1124 if (IS_ERR(phylink)) {
1125 err = PTR_ERR(phylink);
1126 return err;
1127 }
1128
1129 priv->phylink = phylink;
1130
1131 return 0;
1132 }
1133
1134 static void enetc_phylink_destroy(struct enetc_ndev_priv *priv)
1135 {
1136 phylink_destroy(priv->phylink);
1137 }
1138
1139
1140
1141
1142 static int enetc_init_port_rfs_memory(struct enetc_si *si)
1143 {
1144 struct enetc_cmd_rfse rfse = {0};
1145 struct enetc_hw *hw = &si->hw;
1146 int num_rfs, i, err = 0;
1147 u32 val;
1148
1149 val = enetc_port_rd(hw, ENETC_PRFSCAPR);
1150 num_rfs = ENETC_PRFSCAPR_GET_NUM_RFS(val);
1151
1152 for (i = 0; i < num_rfs; i++) {
1153 err = enetc_set_fs_entry(si, &rfse, i);
1154 if (err)
1155 break;
1156 }
1157
1158 return err;
1159 }
1160
1161 static int enetc_init_port_rss_memory(struct enetc_si *si)
1162 {
1163 struct enetc_hw *hw = &si->hw;
1164 int num_rss, err;
1165 int *rss_table;
1166 u32 val;
1167
1168 val = enetc_port_rd(hw, ENETC_PRSSCAPR);
1169 num_rss = ENETC_PRSSCAPR_GET_NUM_RSS(val);
1170 if (!num_rss)
1171 return 0;
1172
1173 rss_table = kcalloc(num_rss, sizeof(*rss_table), GFP_KERNEL);
1174 if (!rss_table)
1175 return -ENOMEM;
1176
1177 err = enetc_set_rss_table(si, rss_table, num_rss);
1178
1179 kfree(rss_table);
1180
1181 return err;
1182 }
1183
1184 static int enetc_pf_register_with_ierb(struct pci_dev *pdev)
1185 {
1186 struct device_node *node = pdev->dev.of_node;
1187 struct platform_device *ierb_pdev;
1188 struct device_node *ierb_node;
1189
1190
1191 if (!node || !of_device_is_available(node))
1192 return 0;
1193
1194 ierb_node = of_find_compatible_node(NULL, NULL,
1195 "fsl,ls1028a-enetc-ierb");
1196 if (!ierb_node || !of_device_is_available(ierb_node))
1197 return -ENODEV;
1198
1199 ierb_pdev = of_find_device_by_node(ierb_node);
1200 of_node_put(ierb_node);
1201
1202 if (!ierb_pdev)
1203 return -EPROBE_DEFER;
1204
1205 return enetc_ierb_register_pf(ierb_pdev, pdev);
1206 }
1207
1208 static int enetc_pf_probe(struct pci_dev *pdev,
1209 const struct pci_device_id *ent)
1210 {
1211 struct device_node *node = pdev->dev.of_node;
1212 struct enetc_ndev_priv *priv;
1213 struct net_device *ndev;
1214 struct enetc_si *si;
1215 struct enetc_pf *pf;
1216 int err;
1217
1218 err = enetc_pf_register_with_ierb(pdev);
1219 if (err == -EPROBE_DEFER)
1220 return err;
1221 if (err)
1222 dev_warn(&pdev->dev,
1223 "Could not register with IERB driver: %pe, please update the device tree\n",
1224 ERR_PTR(err));
1225
1226 err = enetc_pci_probe(pdev, KBUILD_MODNAME, sizeof(*pf));
1227 if (err)
1228 return dev_err_probe(&pdev->dev, err, "PCI probing failed\n");
1229
1230 si = pci_get_drvdata(pdev);
1231 if (!si->hw.port || !si->hw.global) {
1232 err = -ENODEV;
1233 dev_err(&pdev->dev, "could not map PF space, probing a VF?\n");
1234 goto err_map_pf_space;
1235 }
1236
1237 err = enetc_setup_cbdr(&pdev->dev, &si->hw, ENETC_CBDR_DEFAULT_SIZE,
1238 &si->cbd_ring);
1239 if (err)
1240 goto err_setup_cbdr;
1241
1242 err = enetc_init_port_rfs_memory(si);
1243 if (err) {
1244 dev_err(&pdev->dev, "Failed to initialize RFS memory\n");
1245 goto err_init_port_rfs;
1246 }
1247
1248 err = enetc_init_port_rss_memory(si);
1249 if (err) {
1250 dev_err(&pdev->dev, "Failed to initialize RSS memory\n");
1251 goto err_init_port_rss;
1252 }
1253
1254 if (node && !of_device_is_available(node)) {
1255 dev_info(&pdev->dev, "device is disabled, skipping\n");
1256 err = -ENODEV;
1257 goto err_device_disabled;
1258 }
1259
1260 pf = enetc_si_priv(si);
1261 pf->si = si;
1262 pf->total_vfs = pci_sriov_get_totalvfs(pdev);
1263
1264 err = enetc_setup_mac_addresses(node, pf);
1265 if (err)
1266 goto err_setup_mac_addresses;
1267
1268 enetc_configure_port(pf);
1269
1270 enetc_get_si_caps(si);
1271
1272 ndev = alloc_etherdev_mq(sizeof(*priv), ENETC_MAX_NUM_TXQS);
1273 if (!ndev) {
1274 err = -ENOMEM;
1275 dev_err(&pdev->dev, "netdev creation failed\n");
1276 goto err_alloc_netdev;
1277 }
1278
1279 enetc_pf_netdev_setup(si, ndev, &enetc_ndev_ops);
1280
1281 priv = netdev_priv(ndev);
1282
1283 enetc_init_si_rings_params(priv);
1284
1285 err = enetc_alloc_si_resources(priv);
1286 if (err) {
1287 dev_err(&pdev->dev, "SI resource alloc failed\n");
1288 goto err_alloc_si_res;
1289 }
1290
1291 err = enetc_configure_si(priv);
1292 if (err) {
1293 dev_err(&pdev->dev, "Failed to configure SI\n");
1294 goto err_config_si;
1295 }
1296
1297 err = enetc_alloc_msix(priv);
1298 if (err) {
1299 dev_err(&pdev->dev, "MSIX alloc failed\n");
1300 goto err_alloc_msix;
1301 }
1302
1303 err = of_get_phy_mode(node, &pf->if_mode);
1304 if (err) {
1305 dev_err(&pdev->dev, "Failed to read PHY mode\n");
1306 goto err_phy_mode;
1307 }
1308
1309 err = enetc_mdiobus_create(pf, node);
1310 if (err)
1311 goto err_mdiobus_create;
1312
1313 err = enetc_phylink_create(priv, node);
1314 if (err)
1315 goto err_phylink_create;
1316
1317 err = register_netdev(ndev);
1318 if (err)
1319 goto err_reg_netdev;
1320
1321 return 0;
1322
1323 err_reg_netdev:
1324 enetc_phylink_destroy(priv);
1325 err_phylink_create:
1326 enetc_mdiobus_destroy(pf);
1327 err_mdiobus_create:
1328 err_phy_mode:
1329 enetc_free_msix(priv);
1330 err_config_si:
1331 err_alloc_msix:
1332 enetc_free_si_resources(priv);
1333 err_alloc_si_res:
1334 si->ndev = NULL;
1335 free_netdev(ndev);
1336 err_alloc_netdev:
1337 err_init_port_rss:
1338 err_init_port_rfs:
1339 err_device_disabled:
1340 err_setup_mac_addresses:
1341 enetc_teardown_cbdr(&si->cbd_ring);
1342 err_setup_cbdr:
1343 err_map_pf_space:
1344 enetc_pci_remove(pdev);
1345
1346 return err;
1347 }
1348
1349 static void enetc_pf_remove(struct pci_dev *pdev)
1350 {
1351 struct enetc_si *si = pci_get_drvdata(pdev);
1352 struct enetc_pf *pf = enetc_si_priv(si);
1353 struct enetc_ndev_priv *priv;
1354
1355 priv = netdev_priv(si->ndev);
1356
1357 if (pf->num_vfs)
1358 enetc_sriov_configure(pdev, 0);
1359
1360 unregister_netdev(si->ndev);
1361
1362 enetc_phylink_destroy(priv);
1363 enetc_mdiobus_destroy(pf);
1364
1365 enetc_free_msix(priv);
1366
1367 enetc_free_si_resources(priv);
1368 enetc_teardown_cbdr(&si->cbd_ring);
1369
1370 free_netdev(si->ndev);
1371
1372 enetc_pci_remove(pdev);
1373 }
1374
1375 static const struct pci_device_id enetc_pf_id_table[] = {
1376 { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, ENETC_DEV_ID_PF) },
1377 { 0, }
1378 };
1379 MODULE_DEVICE_TABLE(pci, enetc_pf_id_table);
1380
1381 static struct pci_driver enetc_pf_driver = {
1382 .name = KBUILD_MODNAME,
1383 .id_table = enetc_pf_id_table,
1384 .probe = enetc_pf_probe,
1385 .remove = enetc_pf_remove,
1386 #ifdef CONFIG_PCI_IOV
1387 .sriov_configure = enetc_sriov_configure,
1388 #endif
1389 };
1390 module_pci_driver(enetc_pf_driver);
1391
1392 MODULE_DESCRIPTION(ENETC_DRV_NAME_STR);
1393 MODULE_LICENSE("Dual BSD/GPL");