Re: [PATCH net-next 3/6] net: lan966x: add support for interrupts from analyzer
flat view
From: Jakub Kicinski <kuba@kernel.org>
Date: 2021-12-07 02:25:02
Also in:
linux-devicetree, lkml
On Fri, 3 Dec 2021 11:46:42 +0100 Horatiu Vultur wrote:
This patch adds support for handling the interrupts generated by the analyzer. Currently, only the MAC table generates these interrupts. The MAC table will generate an interrupt whenever it learns or forgets an entry in the table. It is the SW responsibility figure out which entries were added/removed. Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
quoted hunk ↗ jump to hunk
+static struct lan966x_mac_entry *lan966x_mac_alloc_entry(struct lan966x *lan966x, + const unsigned char *mac, + u16 vid, u16 port_index) +{ + struct lan966x_mac_entry *mac_entry; + + mac_entry = devm_kzalloc(lan966x->dev, + sizeof(*mac_entry), GFP_ATOMIC);
Is it really necessary to use devm_ allocation for the mac entries? It's 2x memory overhead. Also why GFP_ATOMIC? Memory allocations are _a lot_ less likely with GFP_KERNEL.
quoted hunk ↗ jump to hunk
+ if (!mac_entry) + return NULL; + + memcpy(mac_entry->mac, mac, ETH_ALEN); + mac_entry->vid = vid; + mac_entry->port_index = port_index; + mac_entry->row = LAN966X_MAC_INVALID_ROW; + return mac_entry; +}
quoted hunk ↗ jump to hunk
+static void lan966x_mac_process_raw_entry(struct lan966x_mac_raw_entry *raw_entry, + u8 *mac, u16 *vid, u32 *dest_idx) +{ + mac[0] = (raw_entry->mach >> 8) & 0xff; + mac[1] = (raw_entry->mach >> 0) & 0xff; + mac[2] = (raw_entry->macl >> 24) & 0xff; + mac[3] = (raw_entry->macl >> 16) & 0xff; + mac[4] = (raw_entry->macl >> 8) & 0xff; + mac[5] = (raw_entry->macl >> 0) & 0xff; + + *vid = (raw_entry->mach >> 16) & 0xfff; + *dest_idx = ANA_MACACCESS_DEST_IDX_GET(raw_entry->maca);
Double space before =
quoted hunk ↗ jump to hunk
+} + +static void lan966x_mac_irq_process(struct lan966x *lan966x, u32 row, + struct lan966x_mac_raw_entry *raw_entries) +{ + struct lan966x_mac_entry *mac_entry, *tmp; + unsigned long flags; + char mac[ETH_ALEN]; + u32 dest_idx; + u32 column; + u16 vid; + + spin_lock_irqsave(&lan966x->mac_lock, flags); + list_for_each_entry_safe(mac_entry, tmp, &lan966x->mac_entries, list) { + bool founded = false;
s/founded/found/
quoted hunk ↗ jump to hunk
+ if (mac_entry->row != row) + continue; + + for (column = 0; column < LAN966X_MAC_COLUMNS; ++column) { + /* All the valid entries are at the start of the row, + * so when get one invalid entry it can just skip the + * rest of the columns + */ + if (!ANA_MACACCESS_VALID_GET(raw_entries[column].maca)) + break; + + lan966x_mac_process_raw_entry(&raw_entries[column], + mac, &vid, &dest_idx); + WARN_ON(dest_idx > lan966x->num_phys_ports); + + /* If the entry in SW is found, then there is nothing + * to do + */ + if (mac_entry->vid == vid && + ether_addr_equal(mac_entry->mac, mac) &&
You need to add __aligned(2) to mac, ether_addr_equal() needs aligned arguments.
quoted hunk ↗ jump to hunk
+ mac_entry->port_index == dest_idx) { + raw_entries[column].process = true; + founded = true; + break; + } + }