@@ -687,6 +687,8 @@ static u32 ionic_get_priv_flags(struct net_device *netdev)
struct ionic_lif *lif = netdev_priv(netdev);
u32 priv_flags = 0;
+ ionic_rx_filter_dump(lif);
+
if (test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state))
priv_flags |= IONIC_PRIV_F_SW_DBG_STATS;
@@ -1261,6 +1261,7 @@ int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
struct ionic_rx_filter *f;
int err = 0;
+dev_info(lif->ionic->dev, "%s: addr %pM mc %d\n", __func__, addr, mc);
spin_lock_bh(&lif->rx_filters.lock);
f = ionic_rx_filter_by_addr(lif, addr);
if (f) {
@@ -1345,6 +1346,7 @@ int ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr)
int state;
int err;
+dev_info(lif->ionic->dev, "%s: addr %pM\n", __func__, addr);
spin_lock_bh(&lif->rx_filters.lock);
f = ionic_rx_filter_by_addr(lif, addr);
if (!f) {
@@ -1419,9 +1421,11 @@ void ionic_lif_rx_mode(struct ionic_lif *lif)
if ((lif->nucast + lif->nmcast) >= nfilters) {
rx_mode |= IONIC_RX_MODE_F_PROMISC;
rx_mode |= IONIC_RX_MODE_F_ALLMULTI;
+if (!lif->uc_overflow) dev_info(lif->ionic->dev, "%s: uc_overflow toggled to true\n", __func__);
lif->uc_overflow = true;
lif->mc_overflow = true;
} else if (lif->uc_overflow) {
+if (lif->uc_overflow) dev_info(lif->ionic->dev, "%s: uc_overflow toggled to false\n", __func__);
lif->uc_overflow = false;
lif->mc_overflow = false;
if (!(nd_flags & IFF_PROMISC))
@@ -1701,6 +1705,7 @@ static int ionic_set_mac_address(struct net_device *netdev, void *sa)
if (ether_addr_equal(netdev->dev_addr, mac))
return 0;
+netdev_info(netdev, "%s: mac %pM\n", __func__, mac);
err = eth_prepare_mac_addr_change(netdev, addr);
if (err)
return err;
@@ -3200,6 +3205,7 @@ static int ionic_station_set(struct ionic_lif *lif)
struct sockaddr addr;
int err;
+dev_info(lif->ionic->dev, "%s: netdev addr %pM\n", __func__, netdev->dev_addr);
err = ionic_adminq_post_wait(lif, &ctx);
if (err)
return err;
@@ -244,6 +244,7 @@ int ionic_lif_list_addr(struct ionic_lif *lif, const u8 *addr, bool mode)
struct ionic_rx_filter *f;
int err;
+dev_info(lif->ionic->dev, "%s: addr %pM mode %d\n", __func__, addr, mode);
spin_lock_bh(&lif->rx_filters.lock);
f = ionic_rx_filter_by_addr(lif, addr);
@@ -349,6 +350,7 @@ void ionic_rx_filter_sync(struct ionic_lif *lif)
list_for_each_entry_safe(sync_item, spos, &sync_add_list, list) {
(void)ionic_lif_addr_add(lif, sync_item->f.cmd.mac.addr);
+dev_info(lif->ionic->dev, "%s: sync addr %pM state %d\n", __func__, sync_item->f.cmd.mac.addr, sync_item->f.state);
if (sync_item->f.state != IONIC_FILTER_STATE_SYNCED)
set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state);
@@ -356,3 +358,28 @@ void ionic_rx_filter_sync(struct ionic_lif *lif)
devm_kfree(dev, sync_item);
}
}
+
+void ionic_rx_filter_dump(struct ionic_lif *lif)
+{
+ struct device *dev = lif->ionic->dev;
+ struct ionic_rx_filter *f;
+ struct hlist_head *head;
+ struct hlist_node *tmp;
+ unsigned int i;
+
+ spin_lock_bh(&lif->rx_filters.lock);
+ for (i = 0; i < IONIC_RX_FILTER_HLISTS; i++) {
+ head = &lif->rx_filters.by_id[i];
+ hlist_for_each_entry_safe(f, tmp, head, by_id) {
+ dev_info(dev, "%s: mac %pM flow %d filter_id %d state %d rxq %d\n",
+ __func__, f->cmd.mac.addr, f->flow_id, f->filter_id, f->state, f->rxq_index);
+
+ }
+ }
+ spin_unlock_bh(&lif->rx_filters.lock);
+
+ dev_info(dev, "%s: nucast %d nmcast %d\n",
+ __func__, lif->nucast, lif->nmcast);
+ dev_info(dev, "%s: netdev_uc_count %d netdev_mc_count %d\n",
+ __func__, netdev_uc_count(lif->netdev), netdev_mc_count(lif->netdev));
+}
@@ -45,4 +45,5 @@ void ionic_rx_filter_sync(struct ionic_lif *lif);
int ionic_lif_list_addr(struct ionic_lif *lif, const u8 *addr, bool mode);
int ionic_rx_filters_need_sync(struct ionic_lif *lif);
+void ionic_rx_filter_dump(struct ionic_lif *lif);
#endif /* _IONIC_RX_FILTER_H_ */
Signed-off-by: Shannon Nelson <snelson@pensando.io> --- .../ethernet/pensando/ionic/ionic_ethtool.c | 2 ++ .../net/ethernet/pensando/ionic/ionic_lif.c | 6 +++++ .../ethernet/pensando/ionic/ionic_rx_filter.c | 27 +++++++++++++++++++ .../ethernet/pensando/ionic/ionic_rx_filter.h | 1 + 4 files changed, 36 insertions(+)