> +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

Reply via email to