int oce_m_unicast(void *arg, const uint8_t *uca) { struct oce_dev *dev = arg; int ret; DEV_LOCK(dev); if (dev->suspended) { bcopy(uca, dev->unicast_addr, ETHERADDRL); dev->num_smac = 0; DEV_UNLOCK(dev); return (DDI_SUCCESS); } /* Delete previous one and add new one */ ret = oce_del_mac(dev, dev->if_id, &dev->pmac_id); if (ret != DDI_SUCCESS) { DEV_UNLOCK(dev); return (EIO); } dev->num_smac = 0; bzero(dev->unicast_addr, ETHERADDRL); /* Set the New MAC addr earlier is no longer valid */ ret = oce_add_mac(dev, dev->if_id, uca, &dev->pmac_id); if (ret != DDI_SUCCESS) { DEV_UNLOCK(dev); return (EIO); } bcopy(uca, dev->unicast_addr, ETHERADDRL); dev->num_smac = 1; DEV_UNLOCK(dev); return (ret); } /* oce_m_unicast */
/* Internally resume the rings on group basis (Eg IRM) */ int oce_resume_group_rings(oce_group_t *grp) { struct oce_dev *dev = grp->parent; int qidx, pmac_idx, ret = DDI_SUCCESS; if (grp->state & GROUP_MAC_STARTED) { if (grp->grp_num == 0) { if (dev->num_mca > OCE_MAX_MCA) { ret = oce_set_multicast_table(dev, dev->if_id, &dev->multi_cast[0], OCE_MAX_MCA, B_TRUE, MBX_BOOTSTRAP); } else { ret = oce_set_multicast_table(dev, dev->if_id, &dev->multi_cast[0], dev->num_mca, B_FALSE, MBX_BOOTSTRAP); } if (ret != 0) { oce_log(dev, CE_WARN, MOD_CONFIG, "set mcast failed 0x%x", ret); return (ret); } } /* Add the group based MACs */ for (pmac_idx = 0; pmac_idx < grp->num_pmac; pmac_idx++) { if (grp->pmac_ids[pmac_idx] != INVALID_PMAC_ID) { ret = oce_add_mac(dev, grp->if_id, (uint8_t *)&grp->mac_addr[pmac_idx], &grp->pmac_ids[pmac_idx], MBX_BOOTSTRAP); if (ret != DDI_SUCCESS) { oce_log(dev, CE_WARN, MOD_CONFIG, "MAC addition failed grp = %p, " "idx = %d, ret = %x", (void *)grp, pmac_idx, ret); return (ret); } } } for (qidx = 0; qidx < grp->num_rings; qidx++) { mac_ring_intr_set(grp->ring[qidx].rx->handle, dev->htable[grp->ring[qidx].rx->cq->eq->idx]); (void) oce_start_rq(grp->ring[qidx].rx); } grp->state &= ~GROUP_SUSPEND; } return (ret); }
int oce_group_addmac(void *group_handle, const uint8_t *mac) { oce_group_t *grp = group_handle; struct oce_dev *dev; int pmac_index = 0; int ret; dev = grp->parent; oce_log(dev, CE_NOTE, MOD_CONFIG, "oce_group_addmac , grp_type = %d, grp_num = %d, " "mac = %x:%x:%x:%x:%x:%x", grp->grp_type, grp->grp_num, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); while ((pmac_index < OCE_MAX_PMAC_PER_GRP) && (grp->pmac_ids[pmac_index] != INVALID_PMAC_ID)) { pmac_index++; } if ((pmac_index >= OCE_MAX_PMAC_PER_GRP) || (grp->num_pmac >= OCE_MAX_PMAC_PER_GRP) || (dev->num_pmac >= OCE_MAX_SMAC_PER_DEV)) { oce_log(dev, CE_NOTE, MOD_CONFIG, "PMAC exceeding limits, num_pmac=%d, num_pmac=%d, index=%d", grp->num_pmac, dev->num_pmac, pmac_index); return (ENOSPC); } /* Add the New MAC */ ret = oce_add_mac(dev, grp->if_id, mac, &grp->pmac_ids[pmac_index], MBX_BOOTSTRAP); if (ret != DDI_SUCCESS) { oce_log(dev, CE_WARN, MOD_CONFIG, "%s", "MAC addition failed "); return (EIO); } grp->num_pmac++; dev->num_pmac++; bcopy(mac, &grp->mac_addr[pmac_index], ETHERADDRL); return (0); }