> +static int ocrdma_inet6addr_event(struct notifier_block *, > + unsigned long, void *); > + > +static struct notifier_block ocrdma_inet6addr_notifier = { > + .notifier_call = ocrdma_inet6addr_event > +}; > + > +int ocrdma_get_instance(void) > +{ > + int instance = 0; > + > + /* Assign an unused number */ > + if (!idr_pre_get(&ocrdma_dev_id, GFP_KERNEL)) > + return -1; > + if (idr_get_new(&ocrdma_dev_id, NULL, &instance)) > + return -1; > + return instance; > +} > + > +void ocrdma_get_guid(struct ocrdma_dev *dev, u8 *guid) > +{ > + u8 mac_addr[6]; > + > + memcpy(&mac_addr[0], &dev->nic_info.mac_addr[0], ETH_ALEN); > + guid[0] = mac_addr[0] ^ 2; > + guid[1] = mac_addr[1]; > + guid[2] = mac_addr[2]; > + guid[3] = 0xff; > + guid[4] = 0xfe; > + guid[5] = mac_addr[3]; > + guid[6] = mac_addr[4]; > + guid[7] = mac_addr[5]; > +} > + > +static void ocrdma_build_sgid_mac(union ib_gid *sgid, unsigned char > *mac_addr, > + bool is_vlan, u16 vlan_id) > +{ > + sgid->global.subnet_prefix = cpu_to_be64(0xfe80000000000000LL); > + sgid->raw[8] = mac_addr[0] ^ 2; > + sgid->raw[9] = mac_addr[1]; > + sgid->raw[10] = mac_addr[2]; > + if (is_vlan) { > + sgid->raw[11] = vlan_id >> 8; > + sgid->raw[12] = vlan_id & 0xff; > + } else { > + sgid->raw[11] = 0xff; > + sgid->raw[12] = 0xfe; > + } > + sgid->raw[13] = mac_addr[3]; > + sgid->raw[14] = mac_addr[4]; > + sgid->raw[15] = mac_addr[5]; > +} > + > +static void ocrdma_add_sgid(struct ocrdma_dev *dev, unsigned char *mac_addr, > + bool is_vlan, u16 vlan_id) > +{ > + int i; > + bool found = false; > + union ib_gid new_sgid; > + int free_idx = OCRDMA_MAX_SGID; > + unsigned long flags; > + > + memset(&ocrdma_zero_sgid, 0, sizeof(union ib_gid));
ocrdma_zero_sgid should already be zeroed Actually, can't we either use in6addr_any instead? I see that the mlx4 driver also has a zero gid. So, if we don't want to overload the use of in6addr_any, we can define gid_zero in ib_core. > + > + ocrdma_build_sgid_mac(&new_sgid, mac_addr, is_vlan, vlan_id); > + > + spin_lock_irqsave(&dev->sgid_lock, flags); > + for (i = 0; i < OCRDMA_MAX_SGID; i++) { > + if (!memcmp(&dev->sgid_tbl[i], &ocrdma_zero_sgid, > + sizeof(union ib_gid))) { > + /* found free entry */ > + if (!found) { > + free_idx = i; > + found = true; > + break; > + } > + } else if (!memcmp(&dev->sgid_tbl[i], &new_sgid, > + sizeof(union ib_gid))) { > + /* entry already present, no addition is required. */ > + spin_unlock_irqrestore(&dev->sgid_lock, flags); > + return; > + } > + } > + /* if entry doesn't exist and if table has some space, add entry */ > + if (found) > + memcpy(&dev->sgid_tbl[free_idx], &new_sgid, > + sizeof(union ib_gid)); can move memcpy into for loop and remove found flag > + spin_unlock_irqrestore(&dev->sgid_lock, flags); > +} -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html