Skip to content

Commit c893238

Browse files
Radu Buliedavem330
authored andcommitted
dpaa_eth: Add allmulti option
This patch adds allmulticast option for memac, dtsec and 10GEC controllers. Signed-off-by: Radu Bulie <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 056a01b commit c893238

File tree

9 files changed

+97
-5
lines changed

9 files changed

+97
-5
lines changed

drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,16 @@ static void dpaa_set_rx_mode(struct net_device *net_dev)
454454
err);
455455
}
456456

457+
if (!!(net_dev->flags & IFF_ALLMULTI) != priv->mac_dev->allmulti) {
458+
priv->mac_dev->allmulti = !priv->mac_dev->allmulti;
459+
err = priv->mac_dev->set_allmulti(priv->mac_dev->fman_mac,
460+
priv->mac_dev->allmulti);
461+
if (err < 0)
462+
netif_err(priv, drv, net_dev,
463+
"mac_dev->set_allmulti() = %d\n",
464+
err);
465+
}
466+
457467
err = priv->mac_dev->set_multi(net_dev, priv->mac_dev);
458468
if (err < 0)
459469
netif_err(priv, drv, net_dev, "mac_dev->set_multi() = %d\n",

drivers/net/ethernet/freescale/fman/fman_dtsec.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,25 @@ int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
11171117
return 0;
11181118
}
11191119

1120+
int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable)
1121+
{
1122+
u32 tmp;
1123+
struct dtsec_regs __iomem *regs = dtsec->regs;
1124+
1125+
if (!is_init_done(dtsec->dtsec_drv_param))
1126+
return -EINVAL;
1127+
1128+
tmp = ioread32be(&regs->rctrl);
1129+
if (enable)
1130+
tmp |= RCTRL_MPROM;
1131+
else
1132+
tmp &= ~RCTRL_MPROM;
1133+
1134+
iowrite32be(tmp, &regs->rctrl);
1135+
1136+
return 0;
1137+
}
1138+
11201139
int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr)
11211140
{
11221141
struct dtsec_regs __iomem *regs = dtsec->regs;

drivers/net/ethernet/freescale/fman/fman_dtsec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,6 @@ int dtsec_set_exception(struct fman_mac *dtsec,
5555
int dtsec_add_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
5656
int dtsec_del_hash_mac_address(struct fman_mac *dtsec, enet_addr_t *eth_addr);
5757
int dtsec_get_version(struct fman_mac *dtsec, u32 *mac_version);
58+
int dtsec_set_allmulti(struct fman_mac *dtsec, bool enable);
5859

5960
#endif /* __DTSEC_H */

drivers/net/ethernet/freescale/fman/fman_memac.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ struct fman_mac {
350350
struct fman_rev_info fm_rev_info;
351351
bool basex_if;
352352
struct phy_device *pcsphy;
353+
bool allmulti_enabled;
353354
};
354355

355356
static void add_addr_in_paddr(struct memac_regs __iomem *regs, u8 *adr,
@@ -940,6 +941,29 @@ int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
940941
return 0;
941942
}
942943

944+
int memac_set_allmulti(struct fman_mac *memac, bool enable)
945+
{
946+
u32 entry;
947+
struct memac_regs __iomem *regs = memac->regs;
948+
949+
if (!is_init_done(memac->memac_drv_param))
950+
return -EINVAL;
951+
952+
if (enable) {
953+
for (entry = 0; entry < HASH_TABLE_SIZE; entry++)
954+
iowrite32be(entry | HASH_CTRL_MCAST_EN,
955+
&regs->hashtable_ctrl);
956+
} else {
957+
for (entry = 0; entry < HASH_TABLE_SIZE; entry++)
958+
iowrite32be(entry & ~HASH_CTRL_MCAST_EN,
959+
&regs->hashtable_ctrl);
960+
}
961+
962+
memac->allmulti_enabled = enable;
963+
964+
return 0;
965+
}
966+
943967
int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
944968
{
945969
struct memac_regs __iomem *regs = memac->regs;
@@ -963,8 +987,12 @@ int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
963987
break;
964988
}
965989
}
966-
if (list_empty(&memac->multicast_addr_hash->lsts[hash]))
967-
iowrite32be(hash & ~HASH_CTRL_MCAST_EN, &regs->hashtable_ctrl);
990+
991+
if (!memac->allmulti_enabled) {
992+
if (list_empty(&memac->multicast_addr_hash->lsts[hash]))
993+
iowrite32be(hash & ~HASH_CTRL_MCAST_EN,
994+
&regs->hashtable_ctrl);
995+
}
968996

969997
return 0;
970998
}

drivers/net/ethernet/freescale/fman/fman_memac.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,6 @@ int memac_set_exception(struct fman_mac *memac,
5757
enum fman_mac_exceptions exception, bool enable);
5858
int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
5959
int memac_del_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr);
60+
int memac_set_allmulti(struct fman_mac *memac, bool enable);
6061

6162
#endif /* __MEMAC_H */

drivers/net/ethernet/freescale/fman/fman_tgec.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ struct fman_mac {
217217
struct tgec_cfg *cfg;
218218
void *fm;
219219
struct fman_rev_info fm_rev_info;
220+
bool allmulti_enabled;
220221
};
221222

222223
static void set_mac_address(struct tgec_regs __iomem *regs, u8 *adr)
@@ -564,6 +565,29 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
564565
return 0;
565566
}
566567

568+
int tgec_set_allmulti(struct fman_mac *tgec, bool enable)
569+
{
570+
u32 entry;
571+
struct tgec_regs __iomem *regs = tgec->regs;
572+
573+
if (!is_init_done(tgec->cfg))
574+
return -EINVAL;
575+
576+
if (enable) {
577+
for (entry = 0; entry < TGEC_HASH_TABLE_SIZE; entry++)
578+
iowrite32be(entry | TGEC_HASH_MCAST_EN,
579+
&regs->hashtable_ctrl);
580+
} else {
581+
for (entry = 0; entry < TGEC_HASH_TABLE_SIZE; entry++)
582+
iowrite32be(entry & ~TGEC_HASH_MCAST_EN,
583+
&regs->hashtable_ctrl);
584+
}
585+
586+
tgec->allmulti_enabled = enable;
587+
588+
return 0;
589+
}
590+
567591
int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
568592
{
569593
struct tgec_regs __iomem *regs = tgec->regs;
@@ -591,9 +615,12 @@ int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
591615
break;
592616
}
593617
}
594-
if (list_empty(&tgec->multicast_addr_hash->lsts[hash]))
595-
iowrite32be((hash & ~TGEC_HASH_MCAST_EN),
596-
&regs->hashtable_ctrl);
618+
619+
if (!tgec->allmulti_enabled) {
620+
if (list_empty(&tgec->multicast_addr_hash->lsts[hash]))
621+
iowrite32be((hash & ~TGEC_HASH_MCAST_EN),
622+
&regs->hashtable_ctrl);
623+
}
597624

598625
return 0;
599626
}

drivers/net/ethernet/freescale/fman/fman_tgec.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,6 @@ int tgec_set_exception(struct fman_mac *tgec,
5151
int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
5252
int tgec_del_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr);
5353
int tgec_get_version(struct fman_mac *tgec, u32 *mac_version);
54+
int tgec_set_allmulti(struct fman_mac *tgec, bool enable);
5455

5556
#endif /* __TGEC_H */

drivers/net/ethernet/freescale/fman/mac.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ static void setup_dtsec(struct mac_device *mac_dev)
470470
mac_dev->set_tx_pause = dtsec_set_tx_pause_frames;
471471
mac_dev->set_rx_pause = dtsec_accept_rx_pause_frames;
472472
mac_dev->set_exception = dtsec_set_exception;
473+
mac_dev->set_allmulti = dtsec_set_allmulti;
473474
mac_dev->set_multi = set_multi;
474475
mac_dev->start = start;
475476
mac_dev->stop = stop;
@@ -488,6 +489,7 @@ static void setup_tgec(struct mac_device *mac_dev)
488489
mac_dev->set_tx_pause = tgec_set_tx_pause_frames;
489490
mac_dev->set_rx_pause = tgec_accept_rx_pause_frames;
490491
mac_dev->set_exception = tgec_set_exception;
492+
mac_dev->set_allmulti = tgec_set_allmulti;
491493
mac_dev->set_multi = set_multi;
492494
mac_dev->start = start;
493495
mac_dev->stop = stop;
@@ -506,6 +508,7 @@ static void setup_memac(struct mac_device *mac_dev)
506508
mac_dev->set_tx_pause = memac_set_tx_pause_frames;
507509
mac_dev->set_rx_pause = memac_accept_rx_pause_frames;
508510
mac_dev->set_exception = memac_set_exception;
511+
mac_dev->set_allmulti = memac_set_allmulti;
509512
mac_dev->set_multi = set_multi;
510513
mac_dev->start = start;
511514
mac_dev->stop = stop;

drivers/net/ethernet/freescale/fman/mac.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,15 @@ struct mac_device {
5959
bool rx_pause_active;
6060
bool tx_pause_active;
6161
bool promisc;
62+
bool allmulti;
6263

6364
int (*init)(struct mac_device *mac_dev);
6465
int (*start)(struct mac_device *mac_dev);
6566
int (*stop)(struct mac_device *mac_dev);
6667
void (*adjust_link)(struct mac_device *mac_dev);
6768
int (*set_promisc)(struct fman_mac *mac_dev, bool enable);
6869
int (*change_addr)(struct fman_mac *mac_dev, enet_addr_t *enet_addr);
70+
int (*set_allmulti)(struct fman_mac *mac_dev, bool enable);
6971
int (*set_multi)(struct net_device *net_dev,
7072
struct mac_device *mac_dev);
7173
int (*set_rx_pause)(struct fman_mac *mac_dev, bool en);

0 commit comments

Comments
 (0)