17#include "iLink_internal.h"
19extern unsigned short int LocalNodeID;
20extern int GenerationNumber;
21extern int IntrEventFlag;
25extern unsigned *TargetBuffer;
26extern unsigned int LocalCachedIntr0Register;
29static int iLinkSendData(
struct TransactionContextData *trContext,
unsigned int *header,
unsigned int HeaderLength,
unsigned int *payload,
unsigned int PayloadLength);
31static int iLinkSendData(
struct TransactionContextData *trContext,
unsigned int *header,
unsigned int HeaderLength,
unsigned int *payload,
unsigned int PayloadLength)
33 unsigned int i, *data;
37 ClearEventFlag(IntrEventFlag, ~(iLinkEventDataSent | iLinkEventDataReceived | iLinkEventError));
39 ILINKRegisterBase->ubufTransmitClear = 0;
43 for (i = 0; i < HeaderLength; i++) {
44 if ((trContext != NULL) && (trContext->GenerationNumber != GenerationNumber))
47 ILINKRegisterBase->ubufTransmitNext = *data;
52 if (PayloadLength > 0) {
54 for (i = 0; i < PayloadLength; i++) {
55 if ((trContext != NULL) && (trContext->GenerationNumber != GenerationNumber))
57 ILINKRegisterBase->ubufTransmitNext = *data;
62 ILINKRegisterBase->ubufTransmitLast = *(data - 1);
64 DEBUG_PRINTF(
"Transmitting payload...\n");
65 WaitEventFlag(IntrEventFlag, iLinkEventDataSent | iLinkEventError, WEF_OR, &FlagBits);
67 if (FlagBits & iLinkEventError) {
68 DEBUG_PRINTF(
"iLinkman: TX Error.\n");
71 SignalSema(UBUFTxSema);
73 return ((FlagBits & iLinkEventError) ? (
unsigned int)(-1) : PayloadLength);
76void SendResponse(
unsigned short int NodeID,
unsigned short RcvdBusID,
unsigned char rCode,
unsigned char tLabel,
unsigned char tCode,
unsigned char speed,
unsigned int *buffer,
unsigned int nQuads)
79 unsigned int ResponseHeaderLength;
81 ResponseHeaderLength = (tCode == IEEE1394_TCODE_READB_RESPONSE) ? 4 : 3;
83 DEBUG_PRINTF(
"Sending response to: 0x%04x, RcvdBusID: 0x%04x, rcode: %d, Header length: %u, speed: 0x%04x. Payload length: 0x%08x.\n", NodeID, RcvdBusID, rCode, ResponseHeaderLength, speed, nQuads);
84 DEBUG_PRINTF(
"tCode: 0x%02x\n", tCode);
86 ResponseHeader.header = (((
unsigned int)RcvdBusID) << 22) | (((
unsigned int)speed) << 16) | (((
unsigned int)tLabel) << 10) | (1 << 8) | (((
unsigned int)tCode) << 4);
87 ResponseHeader.header2 = (((
unsigned int)NodeID) << 16) | (((
unsigned int)rCode) << 12);
88 ResponseHeader.reserved = 0;
89 ResponseHeader.LastField = nQuads << 18;
91 iLinkSendData(NULL, (
unsigned int *)&ResponseHeader, ResponseHeaderLength, buffer, nQuads);
98static unsigned int TimeoutCallbackFunction(
void *argv)
102 iSetEventFlag(IntrEventFlag, iLinkEventError);
106static int iLinkSync(
unsigned int PayloadLength)
110 DEBUG_PRINTF(
"Payload transmitted. Now awaiting response...\n");
112 SetAlarm(&Timeout, &TimeoutCallbackFunction, NULL);
113 WaitEventFlag(IntrEventFlag, iLinkEventDataReceived | iLinkEventError, WEF_OR, &FlagBits);
115 if (!(FlagBits & iLinkEventError)) {
116 CancelAlarm(&TimeoutCallbackFunction, NULL);
118 DEBUG_PRINTF(
"iLinkman: Split timeout.\n");
119 LocalCachedIntr0Register |= iLink_INTR0_STO;
122 DEBUG_PRINTF(
"Processing results...\n");
124 if (LocalCachedIntr0Register & iLink_INTR0_InvAck)
126 if (LocalCachedIntr0Register & iLink_INTR0_STO)
128 if (LocalCachedIntr0Register & iLink_INTR0_AckMiss)
130 if (LocalCachedIntr0Register & iLink_INTR0_RetEx)
135 return PayloadLength;
138int iLinkReadReq(
struct TransactionContextData *trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
140 unsigned int nBytesToTransfer;
143 unsigned char tlabel, tCode;
145 DEBUG_PRINTF(
"iLinkTrRead() 0x%08x %08x; nbytes: 0x%08x. Node: 0x%04x.\n", offset_high, offset_low, nBytes, trContext->NodeID);
147 TargetBuffer = buffer;
150 tCode = IEEE1394_TCODE_READQ;
151 TxHeader.header = (((
unsigned int)trContext->speed) << 16) | (((
unsigned int)tlabel) << 10) | (1 << 8) | (((
unsigned int)tCode) << 4);
152 TxHeader.offset_high = (((
unsigned int)trContext->NodeID) << 16) | offset_high;
153 TxHeader.offset_low = offset_low;
154 TxHeader.misc = nBytes << 16;
158 if ((result = iLinkSendData(trContext, (
unsigned int *)&TxHeader, nBytesToTransfer >> 2, NULL, 0)) >= 0) {
159 result = iLinkSync(nBytesToTransfer);
165int iLinkWriteReq(
struct TransactionContextData *trContext,
unsigned short int offset_high,
unsigned int offset_low,
void *buffer,
unsigned int nBytes)
167 unsigned int nBytesToTransfer;
170 unsigned char tlabel, tCode;
172 DEBUG_PRINTF(
"iLinkTrWrite() 0x%08x %08x; nbytes: 0x%08x. Node: 0x%04x.\n", offset_high, offset_low, nBytes, trContext->NodeID);
175 tCode = IEEE1394_TCODE_WRITEQ;
176 TxHeader.header = (((
unsigned int)trContext->speed) << 16) | (((
unsigned int)tlabel) << 10) | (1 << 8) | (((
unsigned int)tCode) << 4);
177 TxHeader.offset_high = (((
unsigned int)trContext->NodeID) << 16) | offset_high;
178 TxHeader.offset_low = offset_low;
179 TxHeader.misc = nBytes << 16;
183 if ((result = iLinkSendData(trContext, (
unsigned int *)&TxHeader, nBytesToTransfer >> 2, buffer, nBytes >> 2)) >= 0) {
184 result = iLinkSync(nBytesToTransfer);