⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 request.c

📁 网络驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
					break;
				}
			}

			return(NDIS_STATUS_SUCCESS);

			break;

		case OID_GEN_CO_SUPPORTED_GUIDS:

			//
			//	Point to the list of supported guids.
			//
			DataToMove = (PUCHAR)gTbAtm155GuidListSupported;
			DataLength = sizeof(gTbAtm155GuidListSupported);

			break;

       // tboid++
       case OID_TBATM_READ_PEEPHOLE:

           //
           //  Vendor Specific OID, Peep-hole read
           //
           DataLength = sizeof(TB_PEEPHOLE);
           if (pRequest->DATA.QUERY_INFORMATION.InformationBufferLength < DataLength)
           {
               pRequest->DATA.QUERY_INFORMATION.BytesNeeded = DataLength;
               Status = NDIS_STATUS_INVALID_LENGTH;
               break;
           }

           pPeepholePara = pRequest->DATA.QUERY_INFORMATION.InformationBuffer;
           if ((pPeepholePara->access_device & 0x01) == 0x01)
           {
               //
               //  Peripheral, access devices via peep-hole
               //
               if (pPeepholePara->address <= 0x3ffff)
               {
                   TBATM155_PH_READ_DEV( pAdapter,
                               pPeepholePara->address,
                               &pPeepholePara->data,
                               &Status);
               }
               else
               {
                   Status = NDIS_STATUS_FAILURE;
               }
           }
           else
           {
               //
               // SRAM, access SRAM via peep-hole
               //
               if (pPeepholePara->address <= 0xffff)
               {
                   TBATM155_PH_READ_SRAM(
                               pAdapter,
                               pPeepholePara->address,
                               &pPeepholePara->data,
                               &Status);
               }
               else
               {
                   Status = NDIS_STATUS_FAILURE;
               }
           }

           if (NDIS_STATUS_SUCCESS == Status)
           {
               pPeepholePara->status = 1;
               pRequest->DATA.QUERY_INFORMATION.BytesWritten = DataLength;
           }
           else
           {
               pPeepholePara->status = 0;
           }

           return(Status);

       case OID_TBATM_READ_CSR:

           //
           //  Vendor Specific OID, CSR read
           //
           DataLength = sizeof(TB_CSR);
           if (pRequest->DATA.QUERY_INFORMATION.InformationBufferLength < DataLength)
           {
               pRequest->DATA.QUERY_INFORMATION.BytesNeeded = DataLength;
               Status = NDIS_STATUS_INVALID_LENGTH;
               break;
           }

           pCsrPara = pRequest->DATA.QUERY_INFORMATION.InformationBuffer;

           if (pCsrPara->address <= 0x36)
           {
               //
               // access CSR
               //
               CsrVirtualAddr = (PUCHAR)pHwInfo->TbAtm155_SAR + (pCsrPara->address << 2);
               TBATM155_READ_PORT(CsrVirtualAddr, &pCsrPara->data);

               pCsrPara->status = 1;
               pRequest->DATA.QUERY_INFORMATION.BytesWritten = DataLength;
           }
           else 	
           {
               Status = NDIS_STATUS_FAILURE;
               pCsrPara->status = 0;
           }

           return(Status);
        // tboid--

       case OID_VENDOR_STRING:

        	DataToMove = (PUCHAR)gTbAtm155DriverDescription;
        	DataLength = sizeof(gTbAtm155DriverDescription);
                break;

	    default:

			DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
				("tbAtm155QueryInformation: Invalid Query Information\n"));

			Status = NDIS_STATUS_NOT_SUPPORTED;

			break;
	}

	//
	//	Copy the data to the buffer provided if necessary.
	//
	if (NDIS_STATUS_SUCCESS == Status)
	{
		if (pRequest->DATA.QUERY_INFORMATION.InformationBufferLength < DataLength)
		{
			pRequest->DATA.QUERY_INFORMATION.BytesNeeded = DataLength;
			Status = NDIS_STATUS_INVALID_LENGTH;
		}
		else
		{
			NdisMoveMemory(
				pRequest->DATA.QUERY_INFORMATION.InformationBuffer,
				DataToMove,
				DataLength);

			pRequest->DATA.QUERY_INFORMATION.BytesWritten = DataLength;
		}
	}

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("<==tbAtm155QueryInformation (Status: 0x%lx)\n", Status));

	return(Status);
}


NDIS_STATUS
tbAtm155SetInformation(
	IN		PADAPTER_BLOCK	pAdapter,
	IN		PVC_BLOCK		pVc,
	IN OUT	PNDIS_REQUEST	pRequest
	)
/*++

Routine Description:

	This routine will process any set requests.

Arguments:

	pAdapter	-	Pointer to the ADAPTER_BLOCK.
	pVc			-	Pointer to the VC_BLOCK.
	pRequest	-	Pointer to the NDIS_REQUEST that identifies the request.

Return Value:

	NDIS_STATUS_NOT_SUPPORTED if we don't understand the request.

--*/
{
   // tboid
   NDIS_STATUS	    Status = NDIS_STATUS_SUCCESS;

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("==>tbAtm155SetInformation\n"));

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("   pAdapter: 0x%x\n   pVc: 0x%x\n   pRequest: 0x%x\n   OID: 0x%x\n",
		 pAdapter, pVc, pRequest, pRequest->DATA.SET_INFORMATION.Oid));

   // tboid++
   switch (pRequest->DATA.SET_INFORMATION.Oid)
   {
      // tboid--

		default:
			UNREFERENCED_PARAMETER(pAdapter);
			UNREFERENCED_PARAMETER(pVc);
			UNREFERENCED_PARAMETER(pRequest);

			Status = NDIS_STATUS_NOT_SUPPORTED;
	}

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("<==tbAtm155SetInformation\n"));

	return (Status);
}


NDIS_STATUS
tbAtm155QueryStatistics(
	IN		PADAPTER_BLOCK	pAdapter,
	IN		PVC_BLOCK		pVc,
	IN OUT	PNDIS_REQUEST	pRequest
	)
/*++

Routine Description:

Arguments:

Return Value:

--*/
{
	NDIS_STATUS				Status;
	PULONG	   			DataToMove;
	ULONG						Data;
	ULONG	   				DataLength;
	PTBATM155_STATISTICS_INFO	pStatInfo;

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("==>tbAtm155QueryStatistics\n"));

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_ERR,
		("tbAtm155QueryStatistics:\n   pAdapter - 0x%x\n   pVc - 0x%x\n   pRequest - 0x%x\n   OID - 0x%x\n",
		 pAdapter, pVc, pRequest, pRequest->DATA.QUERY_INFORMATION.Oid));

	//
	//	First see if the OID is handled by the QueryInformation handler.
	//
	Status = tbAtm155QueryInformation(pAdapter, pVc, pRequest);

	if ((NDIS_STATUS_SUCCESS == Status) ||
		(NDIS_STATUS_PENDING == Status) ||
		(NDIS_STATUS_INVALID_LENGTH == Status))
	{
		DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
			("tbAtm155QueryStatistics: Request handled by tbAtm155QueryInformation\n"));

		//
		//	We are done.
		//
		return(Status);
	}

	//
	//	Default the status to success for below.
	//
	Status = NDIS_STATUS_SUCCESS;

	//
	//	Default length.
	//
	DataToMove = &Data;
	DataLength = sizeof(ULONG);

	//
	//	The switch statement below will copy the statistic counter
	//	to the buffer so that it can finally be copied into the
	//	InformationBuffer.  If the VC_BLOCK passed in is NULL then the
	//	query is for global information.
	//
	pStatInfo = (NULL == pVc) ? &pAdapter->StatInfo : &pVc->StatInfo;

	switch (pRequest->DATA.QUERY_INFORMATION.Oid)
	{
		case OID_GEN_CO_XMIT_PDUS_OK:

			Data = pStatInfo->XmitPdusOk;

			break;

		case OID_GEN_CO_XMIT_PDUS_ERROR:

			Data = pStatInfo->XmitPdusError;

			break;

		case OID_GEN_CO_RCV_PDUS_OK:

			Data = pStatInfo->RecvPdusOk;

			break;

		case OID_GEN_CO_RCV_PDUS_ERROR:

			Data = pStatInfo->RecvPdusError;

			break;

		case OID_GEN_CO_RCV_PDUS_NO_BUFFER:

			Data = pStatInfo->RecvPdusNoBuffer;

			break;

		case OID_GEN_CO_RCV_CRC_ERROR:

			Data = pStatInfo->RecvCrcError;

			break;

		case OID_ATM_RCV_CELLS_OK:

			Data = pStatInfo->RecvCellsOk;

			break;

		case OID_ATM_XMIT_CELLS_OK:

			Data = pStatInfo->XmitCellsOk;

			break;

		case OID_ATM_RCV_CELLS_DROPPED:

			Data = pStatInfo->RecvCellsDropped;

			break;

		case OID_ATM_RCV_INVALID_VPI_VCI:

			Data = pStatInfo->RecvInvalidVpiVci;

			break;

		case OID_ATM_RCV_REASSEMBLY_ERROR:

			DataToMove = &pStatInfo->RecvReassemblyErr;

			break;

		default:

			DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_ERR,
				("tbAtm155QueryStatistics: Invalid Query Statistics\n"));

			Status = NDIS_STATUS_NOT_SUPPORTED;

			break;
	}

	//
	//	Copy the data to the buffer provided if necessary.
	//
	if (NDIS_STATUS_SUCCESS == Status)
	{
		if (pRequest->DATA.QUERY_INFORMATION.InformationBufferLength < DataLength)
		{
			pRequest->DATA.QUERY_INFORMATION.BytesNeeded = DataLength;
			Status = NDIS_STATUS_INVALID_LENGTH;
		}
		else
		{
			NdisMoveMemory(
				pRequest->DATA.QUERY_INFORMATION.InformationBuffer,
				DataToMove,
				DataLength);

			pRequest->DATA.QUERY_INFORMATION.BytesWritten = DataLength;
		}
	}

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("tbAtm155QueryStatistics returning: 0x%lx\n", Status));

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("<==tbAtm155QueryStatistics\n"));

	return(Status);
}


NDIS_STATUS
TbAtm155Request(
	IN		NDIS_HANDLE		MiniportAdapterContext,
	IN		NDIS_HANDLE		MiniportVcContext	OPTIONAL,
	IN	OUT	PNDIS_REQUEST	NdisCoRequest
	)
{
	PADAPTER_BLOCK	pAdapter = (PADAPTER_BLOCK)MiniportAdapterContext;
	PVC_BLOCK		pVc = (PVC_BLOCK)MiniportVcContext;
	NDIS_STATUS		Status = NDIS_STATUS_FAILURE;

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("==>TbAtm155Request\n"));

	switch (NdisCoRequest->RequestType)
	{
		case NdisRequestQueryInformation:

			DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
				("TbAtm155Request:  NdisRequestQueryInformation\n"));

			Status = tbAtm155QueryInformation(pAdapter, pVc, NdisCoRequest);

			break;

		case NdisRequestSetInformation:

			DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
				("TbAtm155Request:  NdisRequestSetInformation\n"));

			Status = tbAtm155SetInformation(pAdapter, pVc, NdisCoRequest);

			break;

		case NdisRequestQueryStatistics:

			DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
				("TbAtm155Request:  NdisRequestQueryStatistics\n"));

			Status = tbAtm155QueryStatistics(pAdapter, pVc, NdisCoRequest);

			break;
	}

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("TbAtm155Request: Return status - 0x%x\n", Status));

	DBGPRINT(DBG_COMP_REQUEST, DBG_LEVEL_INFO,
		("<==TbAtm155Request\n"));

	return(Status);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -