26 act2000_isa_reset(
unsigned short portbase)
40 for (i = 0; i < 16; i++) {
57 ret = act2000_isa_reset(portbase);
88 act2000_isa_select_irq(act2000_card *card)
120 act2000_isa_enable_irq(act2000_card *card)
122 act2000_isa_select_irq(card);
136 if (card->flags & ACT2000_FLAGS_IVALID) {
139 card->flags &= ~ACT2000_FLAGS_IVALID;
146 if (
request_irq(irq, &act2000_isa_interrupt, 0, card->regname, card)) {
148 card->flags |= ACT2000_FLAGS_IVALID;
150 "act2000: Could not request irq %d\n", irq);
153 act2000_isa_select_irq(card);
164 if (card->flags & ACT2000_FLAGS_PVALID) {
166 card->flags &= ~ACT2000_FLAGS_PVALID;
171 card->port = portbase;
172 card->flags |= ACT2000_FLAGS_PVALID;
186 if (card->flags & ACT2000_FLAGS_IVALID)
189 card->flags &= ~ACT2000_FLAGS_IVALID;
190 if (card->flags & ACT2000_FLAGS_PVALID)
192 card->flags &= ~ACT2000_FLAGS_PVALID;
193 spin_unlock_irqrestore(&card->lock, flags);
197 act2000_isa_writeb(act2000_card *card,
u_char data)
214 act2000_isa_readb(act2000_card *card,
u_char *data)
237 while (!act2000_isa_readb(card, &c)) {
238 if (card->idat.isa.rcvidx < 8) {
239 card->idat.isa.rcvhdr[card->idat.isa.rcvidx++] =
c;
240 if (card->idat.isa.rcvidx == 8) {
244 card->idat.isa.rcvlen = ((
actcapi_msghdr *)&card->idat.isa.rcvhdr)->len;
245 card->idat.isa.rcvskb = dev_alloc_skb(card->idat.isa.rcvlen);
246 if (card->idat.isa.rcvskb ==
NULL) {
247 card->idat.isa.rcvignore = 1;
249 "act2000_isa_receive: no memory\n");
253 memcpy(
skb_put(card->idat.isa.rcvskb, 8), card->idat.isa.rcvhdr, 8);
254 card->idat.isa.rcvptr =
skb_put(card->idat.isa.rcvskb, card->idat.isa.rcvlen - 8);
256 card->idat.isa.rcvidx = 0;
258 "act2000_isa_receive: Invalid CAPI msg\n");
261 for (i = 0, p = (
__u8 *)&card->idat.isa.rcvhdr, t = tmp; i < 8; i++)
262 t +=
sprintf(t,
"%02x ", *(p++));
268 if (!card->idat.isa.rcvignore)
269 *card->idat.isa.rcvptr++ =
c;
270 if (++card->idat.isa.rcvidx >= card->idat.isa.rcvlen) {
271 if (!card->idat.isa.rcvignore) {
273 act2000_schedule_rx(card);
275 card->idat.isa.rcvidx = 0;
276 card->idat.isa.rcvlen = 8;
277 card->idat.isa.rcvignore = 0;
278 card->idat.isa.rcvskb =
NULL;
279 card->idat.isa.rcvptr = card->idat.isa.rcvhdr;
283 if (!(card->flags & ACT2000_FLAGS_IVALID)) {
285 if ((card->idat.isa.rcvidx) &&
286 (card->idat.isa.rcvignore ||
287 (card->idat.isa.rcvidx < card->idat.isa.rcvlen)))
288 act2000_schedule_poll(card);
307 card->ack_msg = card->sbuf->data;
312 card->need_b3ack = msg->
msg.data_b3_req.
flags;
317 spin_unlock_irqrestore(&card->lock, flags);
326 if (act2000_isa_writeb(card, *(skb->
data))) {
330 act2000_schedule_tx(card);
343 skb->
data = card->ack_msg;
345 msg->
msg.data_b3_req.
flags = card->need_b3ack;
357 act2000_isa_getid(act2000_card *card)
367 if (act2000_isa_readb(card, p++))
384 if (card->flags & ACT2000_FLAGS_IVALID) {
386 act2000_isa_enable_irq(card);
406 if (!act2000_isa_reset(card->port))
420 l = (length > 1024) ? 1024 : length;
428 if (act2000_isa_writeb(card, *b++)) {
430 "act2000: loader timed out"
431 " len=%d c=%d\n", length, c);
442 return (act2000_isa_getid(card));