GT_STATUS gprtGetPhyIntPortSummary ( IN GT_QD_DEV *dev, OUT GT_U16 *intPortMask ) { GT_STATUS retVal; GT_U8 hwPort; /* the physical port number */ GT_U16 portVec; #ifdef GT_USE_MAD if (dev->use_mad==GT_TRUE) return gprtGetPhyIntPortSummary_mad(dev, intPortMask); #endif DBG_INFO(("gprtGetPhyIntPortSummary Called.\n")); /* translate LPORT 0 to hardware port */ hwPort = GT_LPORT_2_PORT(0); *intPortMask=0; if (IS_IN_DEV_GROUP(dev,DEV_DEV_PHY_INTERRUPT)) { return GT_NOT_SUPPORTED; } if (IS_IN_DEV_GROUP(dev,DEV_INTERNAL_GPHY)) { /* get the interrupt port summary from global register */ retVal = hwGetGlobal2RegField(dev,QD_REG_PHYINT_SOURCE,0,dev->maxPorts,&portVec); GT_GIG_PHY_INT_MASK(dev,portVec); *intPortMask = (GT_U16)GT_PORTVEC_2_LPORTVEC(portVec); } else { /* get the interrupt port summary from phy */ retVal = hwReadPhyReg(dev,hwPort, QD_PHY_INT_PORT_SUMMARY_REG, &portVec); *intPortMask = (GT_U16)GT_PORTVEC_2_LPORTVEC(portVec); } if(retVal != GT_OK) { DBG_INFO(("Failed.\n")); } else { DBG_INFO(("OK.\n")); } return retVal; }
/******************************************************************************* * gsysSetQoSWeight * * DESCRIPTION: * Programmable Round Robin Weights. * Each port has 4/8 output Queues. Queue 3/7 has the highest priority and * Queue 0 has the lowest priority. When a scheduling mode of port is * configured as Weighted Round Robin queuing mode, the access sequece of the * Queue is 3,2,3,1,3,2,3,0,3,2,3,1,3,2,3 by default. * (Queue is 7,6,5,7,1,6,7,4 by default. That is after 6390.) * This sequence can be configured with this API. * * INPUTS: * weight - access sequence of the queue * * OUTPUTS: * None. * * RETURNS: * GT_OK - on success * GT_FAIL - on error * GT_NOT_SUPPORTED - if current device does not support this feature. * * COMMENTS: * None * *******************************************************************************/ GT_STATUS gsysSetQoSWeight ( IN GT_QD_DEV *dev, IN GT_QoS_WEIGHT *weight ) { GT_STATUS retVal; /* Functions return value. */ GT_U16 data; GT_U32 len, i; int length_loc, entry_num; DBG_INFO(("gsysSetQoSWeight Called.\n")); /* Check if Switch supports this feature. */ if (!IS_IN_DEV_GROUP(dev,DEV_QoS_WEIGHT)) { DBG_INFO(("GT_NOT_SUPPORTED\n")); return GT_NOT_SUPPORTED; } if (IS_IN_DEV_GROUP(dev,DEV_QoS_WEIGHT_1)) { length_loc = 0x40; entry_num = 2; } else { length_loc = 0x20; entry_num = 4; } if (weight->len > 128) { DBG_INFO(("GT_BAD_PARAM\n")); return GT_BAD_PARAM; } gtSemTake(dev,dev->tblRegsSem,OS_WAIT_FOREVER); len = weight->len/entry_num; /* program QoS Weight Table, 4/2 sequences at a time */ for(i=0; i<len; i++) { /* Wait until the QoS Weight Table is ready. */ #ifdef GT_RMGMT_ACCESS { HW_DEV_REG_ACCESS regAccess; regAccess.entries = 2; regAccess.rw_reg_list[0].cmd = HW_REG_WAIT_TILL_0; regAccess.rw_reg_list[0].addr = CALC_SMI_DEV_ADDR(dev, 0, GLOBAL2_REG_ACCESS); regAccess.rw_reg_list[0].reg = QD_REG_QOS_WEIGHT; regAccess.rw_reg_list[0].data = 15; regAccess.rw_reg_list[1].cmd = HW_REG_WRITE; regAccess.rw_reg_list[1].addr = CALC_SMI_DEV_ADDR(dev, 0, GLOBAL2_REG_ACCESS); regAccess.rw_reg_list[1].reg = QD_REG_QOS_WEIGHT; if (IS_IN_DEV_GROUP(dev,DEV_QoS_WEIGHT_1)) { data = (GT_U16)((1 << 15) | (i << 8) | (weight->queue[i*2] & 0x7) | ((weight->queue[i*2+1] & 0x7) << 4); } else { data = (GT_U16)((1 << 15) | (i << 8) | (weight->queue[i*4] & 0x3) | ((weight->queue[i*4+1] & 0x3) << 2) | ((weight->queue[i*4+2] & 0x3) << 4) | ((weight->queue[i*4+3] & 0x3) << 6)); } regAccess.rw_reg_list[1].data = data; retVal = hwAccessMultiRegs(dev, ®Access); if(retVal != GT_OK) { gtSemGive(dev,dev->tblRegsSem); return retVal; } } #else data = 1; while(data == 1) { retVal = hwGetGlobal2RegField(dev,QD_REG_QOS_WEIGHT,15,1,&data); if(retVal != GT_OK) { gtSemGive(dev,dev->tblRegsSem); return retVal; } } if (IS_IN_DEV_GROUP(dev,DEV_QoS_WEIGHT_1)) { data = (GT_U16)((1 << 15) | (i << 8) | (weight->queue[i*2] & 0x7) | ((weight->queue[i*2+1] & 0x7) << 4)); } else { data = (GT_U16)((1 << 15) | (i << 8) | (weight->queue[i*4] & 0x3) | ((weight->queue[i*4+1] & 0x3) << 2) | ((weight->queue[i*4+2] & 0x3) << 4) | ((weight->queue[i*4+3] & 0x3) << 6)); } retVal = hwWriteGlobal2Reg(dev, QD_REG_QOS_WEIGHT, data); if(retVal != GT_OK) { DBG_INFO(("Failed.\n")); gtSemGive(dev,dev->tblRegsSem); return retVal; } #endif }