pfsgetstatus.c
3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**************************************************************************
* *
* Copyright (C) 1995, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#include "osint.h"
#include "controller.h"
#include "siint.h"
#ifdef BBPLAYER
#include "bbint.h"
#endif
extern s32 __osCheckPackId(OSPfs *, __OSPackId *);
extern s32 __osRepairPackId(OSPfs *, __OSPackId *, __OSPackId *);
s32
__osPfsGetStatus(OSMesgQueue *queue, int channel)
{
#ifdef BBPLAYER
if (__osBbPakAddress[channel])
return 0;
else
return PFS_ERR_NOPACK;
#else
s32 ret = 0;
OSMesg dummy;
OSContStatus data;
__osPfsInodeCacheBank = 250; /* Bank of Inode Cache */
/* Set up request command format for all channels */
__osPfsRequestOneChannel(channel, CONT_REQUEST);
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
(void)osRecvMesg(queue, &dummy, OS_MESG_BLOCK);
/* trigger pifmacro */
ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
(void)osRecvMesg(queue, &dummy, OS_MESG_BLOCK);
/* reformat the 64 bytes RAM data and save in data array */
__osPfsGetOneChannelData(channel, &data);
if (((data.status & CONT_CARD_ON) != 0) &&
((data.status & CONT_CARD_PULL) != 0)) {
return(PFS_ERR_NEW_PACK);
} else if (data.errno || ((data.status & CONT_CARD_ON) == 0)) {
return(PFS_ERR_NOPACK);
} else if ((data.status & CONT_ADDR_CRC_ER) != 0)
return(PFS_ERR_CONTRFAIL);
return(ret);
#endif
}
void
__osPfsRequestOneChannel(int channel, u8 cmd)
{
u8 *ptr;
__OSContRequesFormatShort requestformat;
int i;
__osContLastCmd = CONT_ETC;
/* clear pif ram */
__osPfsPifRam.pifstatus = CONT_FORMAT;
ptr = (u8 *)(&__osPfsPifRam);
/* Setup request format for each channel */
requestformat.txsize = 1;
requestformat.rxsize = 3;
requestformat.cmd = cmd;
requestformat.typeh = 0xff;
requestformat.typel = 0xff;
requestformat.status = 0xff;
for (i = 0; i < channel; i++) {
*ptr++ = 0x00; /* skip */
}
/* setup request format for all the channel */
*((__OSContRequesFormatShort *)ptr) = requestformat;
ptr += sizeof(requestformat);
*((u8 *)ptr) = FORMAT_END;
}
/*
* Reformat the 64 bytes RAM data into RequestData format
* and check error code.
*/
void
__osPfsGetOneChannelData(int channel, OSContStatus *data)
{
u8 *ptr;
__OSContRequesFormatShort requestformat;
int i;
ptr = (u8 *)(&__osPfsPifRam);
for (i = 0; i < channel; i++) {
ptr++; /* skip */
}
/* read request format for one channel */
requestformat = *((__OSContRequesFormatShort *)ptr);
data->errno = (u8)((requestformat.rxsize & CON_ERR_MASK) >> 4);
if (data->errno) return;
data->type =(u16)((requestformat.typel<<8)|requestformat.typeh);
data->status = requestformat.status;
}