コード例 #1
0
ファイル: oce_gld.c プロジェクト: apprisi/illumos-gate
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 */
コード例 #2
0
/* 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);
}
コード例 #3
0
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);
}