qeth: optimize IP handling in rx_mode callback
In layer3 mode of the qeth driver, multicast IP addresses from struct net_device and other type of IP addresses from other sources require mapping to the OSA-card. This patch simplifies the IP address mapping logic, and changes imple- mentation of ndo_set_rx_mode callback and ip notifier events. Addresses are stored in private hashtables instead of lists now. It allows hardware registration/removal for new/deleted multicast addresses only. Signed-off-by: Lakhvich Dmitriy <ldmitriy@ru.ibm.com> Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> Reviewed-by: Evgeny Cherkashin <Eugene.Crosser@ru.ibm.com> Reviewed-by: Thomas Richter <tmricht@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
6059c90537
commit
5f78e29cee
@@ -780,7 +780,7 @@ qeth_l2_add_mac(struct qeth_card *card, struct netdev_hw_addr *ha, u8 is_uc)
|
||||
qeth_l2_mac_hash(ha->addr)) {
|
||||
if (is_uc == mac->is_uc &&
|
||||
!memcmp(ha->addr, mac->mac_addr, OSA_ADDR_LEN)) {
|
||||
mac->disp_flag = QETH_DISP_MAC_DO_NOTHING;
|
||||
mac->disp_flag = QETH_DISP_ADDR_DO_NOTHING;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -792,7 +792,7 @@ qeth_l2_add_mac(struct qeth_card *card, struct netdev_hw_addr *ha, u8 is_uc)
|
||||
|
||||
memcpy(mac->mac_addr, ha->addr, OSA_ADDR_LEN);
|
||||
mac->is_uc = is_uc;
|
||||
mac->disp_flag = QETH_DISP_MAC_ADD;
|
||||
mac->disp_flag = QETH_DISP_ADDR_ADD;
|
||||
|
||||
hash_add(card->mac_htable, &mac->hnode,
|
||||
qeth_l2_mac_hash(mac->mac_addr));
|
||||
@@ -825,7 +825,7 @@ static void qeth_l2_set_rx_mode(struct net_device *dev)
|
||||
qeth_l2_add_mac(card, ha, 1);
|
||||
|
||||
hash_for_each_safe(card->mac_htable, i, tmp, mac, hnode) {
|
||||
if (mac->disp_flag == QETH_DISP_MAC_DELETE) {
|
||||
if (mac->disp_flag == QETH_DISP_ADDR_DELETE) {
|
||||
if (!mac->is_uc)
|
||||
rc = qeth_l2_send_delgroupmac(card,
|
||||
mac->mac_addr);
|
||||
@@ -837,15 +837,15 @@ static void qeth_l2_set_rx_mode(struct net_device *dev)
|
||||
hash_del(&mac->hnode);
|
||||
kfree(mac);
|
||||
|
||||
} else if (mac->disp_flag == QETH_DISP_MAC_ADD) {
|
||||
} else if (mac->disp_flag == QETH_DISP_ADDR_ADD) {
|
||||
rc = qeth_l2_write_mac(card, mac);
|
||||
if (rc) {
|
||||
hash_del(&mac->hnode);
|
||||
kfree(mac);
|
||||
} else
|
||||
mac->disp_flag = QETH_DISP_MAC_DELETE;
|
||||
mac->disp_flag = QETH_DISP_ADDR_DELETE;
|
||||
} else
|
||||
mac->disp_flag = QETH_DISP_MAC_DELETE;
|
||||
mac->disp_flag = QETH_DISP_ADDR_DELETE;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&card->mclock);
|
||||
|
Reference in New Issue
Block a user