3 Copyright (C) 2004-2011 Neil Cafferkey
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 #include <exec/types.h>
24 #include <libraries/prometheus.h>
26 #include <proto/exec.h>
27 #include <proto/prometheus.h>
32 #include "pci_protos.h"
33 #include "prometheus_protos.h"
36 /****i* etherlink3.device/GetPrometheusCount *******************************
42 * count = GetPrometheusCount()
44 * ULONG GetPrometheusCount();
46 ****************************************************************************
50 ULONG
GetPrometheusCount(struct DevBase
*base
)
53 PCIBoard
*card
= NULL
;
54 UPINT vendor_id
, product_id
;
56 while((card
= Prm_FindBoardTagList(card
, NULL
)) != NULL
)
58 Prm_GetBoardAttrsTags(card
, PRM_Vendor
, (UPINT
)&vendor_id
,
59 PRM_Device
, (UPINT
)&product_id
, TAG_END
);
60 if(IsCardCompatible(vendor_id
, product_id
, base
))
69 /****i* etherlink3.device/AllocPrometheusCard ******************************
72 * AllocPrometheusCard -- Take control of a card.
75 * context = AllocPrometheusCard(index)
77 * struct BusContext *AllocPrometheusCard(ULONG);
79 ****************************************************************************
83 struct BusContext
*AllocPrometheusCard(ULONG index
, struct DevBase
*base
)
86 struct BusContext
*context
;
87 PCIBoard
*card
= NULL
;
89 UPINT vendor_id
, product_id
;
91 /* Find a compatible card */
93 context
= AllocMem(sizeof(struct BusContext
), MEMF_PUBLIC
| MEMF_CLEAR
);
101 card
= Prm_FindBoardTagList(card
, NULL
);
102 Prm_GetBoardAttrsTags(card
, PRM_Vendor
, (UPINT
)&vendor_id
,
103 PRM_Device
, (UPINT
)&product_id
, TAG_END
);
104 if(IsCardCompatible(vendor_id
, product_id
, base
))
108 context
->card
= card
;
113 /* Get base address and generation */
117 Prm_GetBoardAttrsTags(card
,
118 PRM_MemoryAddr0
+ BAR_NO
, (UPINT
)&context
->io_base
, TAG_END
);
119 if(context
->io_base
== 0)
121 context
->generation
= GetGeneration(product_id
, base
);
128 if(!Prm_SetBoardAttrsTags(card
, PRM_BoardOwner
, (UPINT
)base
, TAG_END
))
134 FreePrometheusCard(context
, base
);
143 /****i* etherlink3.device/FreePrometheusCard *******************************
146 * FreePrometheusCard -- Release a card.
149 * FreePrometheusCard(context)
151 * VOID FreePrometheusCard(struct BusContext *);
153 ****************************************************************************
157 VOID
FreePrometheusCard(struct BusContext
*context
, struct DevBase
*base
)
164 card
= context
->card
;
169 Prm_GetBoardAttrsTags(card
, PRM_BoardOwner
, (UPINT
)&owner
,
172 Prm_SetBoardAttrsTags(card
, PRM_BoardOwner
, NULL
, TAG_END
);
175 FreeMem(context
, sizeof(struct BusContext
));
183 /****i* etherlink3.device/AddPrometheusIntServer ***************************
186 * AddPrometheusIntServer
189 * success = AddPrometheusIntServer(card, interrupt)
191 * BOOL AddPrometheusIntServer(APTR, struct Interrupt *);
193 ****************************************************************************
197 BOOL
AddPrometheusIntServer(APTR card
, struct Interrupt
*interrupt
,
198 struct DevBase
*base
)
200 return Prm_AddIntServer(card
, interrupt
);
205 /****i* etherlink3.device/RemPrometheusIntServer ***************************
208 * RemPrometheusIntServer
211 * RemPrometheusIntServer(card, interrupt)
213 * VOID RemPrometheusIntServer(APTR, struct Interrupt *);
215 ****************************************************************************
219 VOID
RemPrometheusIntServer(APTR card
, struct Interrupt
*interrupt
,
220 struct DevBase
*base
)
222 Prm_RemIntServer(card
, interrupt
);
229 /****i* etherlink3.device/AllocPrometheusDMAMem ****************************
232 * AllocPrometheusDMAMem
235 * mem = AllocPrometheusDMAMem(context, size, alignment)
237 * APTR AllocPrometheusDMAMem(struct BusContext *, UPINT, UWORD);
239 ****************************************************************************
241 * Alignment currently must be minimum of 8 bytes.
245 APTR
AllocPrometheusDMAMem(UPINT size
, struct DevBase
*base
)
247 return Prm_AllocDMABuffer(size
);
252 /****i* etherlink3.device/FreePrometheusDMAMem *****************************
255 * FreePrometheusDMAMem
258 * FreePrometheusDMAMem(context, mem)
260 * VOID FreePrometheusDMAMem(struct BusContext *, APTR);
262 ****************************************************************************
266 VOID
FreePrometheusDMAMem(APTR mem
, UPINT size
, struct DevBase
*base
)
268 Prm_FreeDMABuffer(mem
, size
);