//
// Copyright (c) 1998-1999, Microsoft Corporation, all rights reserved
//
// send.h
//
// IEEE1394 mini-port/call-manager driver
//
// Send.h - Mini-port Send routines
//
// 06/20/1999 ADube Created, 
//

//
//  A Send follows this simple algorithm:
//  Copy incoming data to local buffers
//  Insert Fragment Headers if necessary
//  Create an Mdl for the local copy
//  Store the IRB and VC in the ndispacket
//  Use the ndispacket as context in the irp's completion routine
//  



NDIS_STATUS
AsyncStreamSendPacketsHandler (
    IN PVCCB pChannelVc,
    IN PNDIS_PACKET pPacket 
    );


NDIS_STATUS
AsyncWriteSendPacketsHandler(
    IN VCCB *pVC,
    IN NDIS_PACKET *Packet 
    );


NDIS_STATUS
nicCopyNdisBufferChainToBuffer(
    IN     PNDIS_BUFFER pInMdl,
    IN OUT PVOID        pLocalBuffer, 
    IN     UINT         Length 
    );


NDIS_STATUS
nicFreeIrb(
    IN PIRB pIrb 
    );


NDIS_STATUS
nicFreeIrp(
    IN PIRP pIrp 
    );


NDIS_STATUS
nicFreeLocalBuffer(
    IN UINT Length,
    IN PVOID pLocalBuffer 
    );


NDIS_STATUS
nicGetIrb(
    OUT PIRB *ppIrb 
    );


NDIS_STATUS
nicGetIrp(
    IN  PDEVICE_OBJECT pPdo,
    OUT PIRP *ppIrp 
    );


NDIS_STATUS
nicFreeMdl( 
    IN  PMDL pMdl 
    );


NDIS_STATUS
nicFreePrivateIrb(
    PNDIS1394_IRB pIrb
    );


NDIS_STATUS
nicGetPrivateIrb(
    IN PADAPTERCB pAdapter OPTIONAL,
    IN PREMOTE_NODE pRemoteNode OPTIONAL,
    IN PVCCB pVc,
    IN PVOID pContext,
    OUT PNDIS1394_IRB *ppIrb 
    );


NDIS_STATUS
nicGetLocalBuffer(
    IN  ULONG Length,
    OUT PVOID *ppLocalBuffer 
    );

PVOID
nicGetLookasideBuffer(
    IN  PNIC_NPAGED_LOOKASIDE_LIST pLookasideList
    );


NDIS_STATUS
nicGetMdl(
    IN UINT     Length,
    IN PVOID    LocalBuffer,
    OUT PMDL    *ppMyMdl
    );


NDIS_STATUS
nicGetMdlToTransmit(
    IN PNDIS_PACKET     pPacket, 
    OUT PMDL            *ppMyMdl 
    );


NDIS_STATUS
DummySendPacketsHandler(
    IN PVCCB        pVc,
    IN PNDIS_PACKET  pPacket 
    );

VOID
nicSendFailureInvalidGeneration(
    PVCCB pVc
    );
    

//-----------------------------------------------------------------------------
// Local prototypes (alphabetically)
//-----------------------------------------------------------------------------


NTSTATUS
AsyncStreamDummySendComplete(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             pMyIrp,
    IN PVOID           Context   
    );
    

NTSTATUS
AsyncWriteStreamSendComplete(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             pMyIrp,
    IN PVOID           Context   
    );


NTSTATUS
AsyncStreamSendComplete(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             pMyIrp,
    IN PVOID            Context 
    );


NDIS_STATUS
nicFreeAsyncWritePacketDataStructures(
    IN PVCCB pVc,
    IN PIRP  pIrp               OPTIONAL,
    IN PVOID pLocalBuffer       OPTIONAL,
    IN PNIC_NPAGED_LOOKASIDE_LIST   pLookasideList   OPTIONAL
  );


NDIS_STATUS
nicEthernetVcSend(
    IN PVCCB        pVc,
    IN PNDIS_PACKET  pPacket 
    );





VOID
nicInitAsyncStreamIrb(
    IN     PCHANNEL_VCCB pChannelVc, 
    IN     PMDL pMdl, 
    IN OUT PIRB pIrb
    );


VOID
nicInitAsyncWriteIrb(
    IN     PSENDFIFO_VCCB pVc, 
    IN     PMDL pMyMdl, 
    IN OUT PIRB pMyIrb
    );




NDIS_STATUS
nicInsertGaspHeader (
    IN PADAPTERCB pAdapter,
    IN PNDIS_PACKET pNdisPacket
    );


NDIS_STATUS
nicGetGaspHeader (
    IN OUT PNDIS_BUFFER *ppNdisBuffer
    );



VOID
nicFreeGaspHeader (
    IN PNDIS_BUFFER pGaspNdisBuffer
    );

VOID
nicFreeToNPagedLookasideList (
    IN PNIC_NPAGED_LOOKASIDE_LIST pLookasideList,
    IN PVOID    pBuffer
    );
    
VOID
nicMakeGaspHeader (
    IN PADAPTERCB pAdapter,
    IN PGASP_HEADER pGaspHeader
    );

NDIS_STATUS
nicCopyOneFragment (
    PFRAGMENTATION_STRUCTURE pFragment
    );

VOID
nicCopyUnfragmentedHeader ( 
    IN PNIC1394_UNFRAGMENTED_HEADER pDestUnfragmentedHeader,
    IN PVOID pSrcUnfragmentedHeader
    );
    




NDIS_STATUS
nicFirstFragmentInitialization (
    IN PNDIS_BUFFER pStartNdisBuffer,
    IN ULONG DatagramLabelLong,
    OUT PFRAGMENTATION_STRUCTURE  pFragment          
    );


VOID
nicInitializeLookasideListHeader (
    IN OUT PLOOKASIDE_BUFFER_HEADER pHeader,
    IN PNDIS_PACKET pNdisPacket,
    IN PVCCB pVc,
    IN PNDIS_BUFFER pCurrNdisBuffer,
    IN BUS_OPERATION AsyncOp,
    IN PADAPTERCB pAdapter
    );
    

NDIS_STATUS
nicCopyNdisPacketToUnfragmentedBuffer(
    IN PNIC_NPAGED_LOOKASIDE_LIST  pLookasideList,
    IN PNDIS_BUFFER pStartNdisBuffer,
    IN ULONG PacketLength,
    IN BUS_OPERATION AsyncOp,
    IN PGASP_HEADER pGaspHeader,
    OUT PVOID*  ppStartFragmentAddress,
    OUT PVOID *ppLookasideListBuffer
    );

    

VOID
nicAddFragmentHeader (
    IN PVOID pStartFragmentData, 
    IN PFRAGMENTATION_STRUCTURE pFragmentStructure,
    IN ULONG BufferSize
    );




NDIS_STATUS
nicFreeAsyncStreamPacketDataStructures(
    IN PVCCB pVc,
    IN PIRP  pIrp               OPTIONAL,
    IN PVOID pLocalBuffer       OPTIONAL,
    IN PNIC_NPAGED_LOOKASIDE_LIST   pLookasideList   OPTIONAL
  );


VOID
nicGetGenerationWorkItem(
    NDIS_WORK_ITEM* pGetGenerationWorkItem,
    IN PVOID Context 
    );

VOID
nicMpCoSendComplete (
    NDIS_STATUS NdisStatus,
    PVCCB pVc,
    PNDIS_PACKET pPacket
    );



VOID
nicSendTimer (
    IN  PVOID                   SystemSpecific1,
    IN  PVOID                   FunctionContext,
    IN  PVOID                   SystemSpecific2,
    IN  PVOID                   SystemSpecific3
    );



UINT
nicNumFragmentsNeeded (
    UINT PacketLength ,
    UINT MaxPayload,
    UINT FragmentOverhead
    );