static void req_queue(ADAPTER * a, byte e_no) { card_t *card; int ipl; card = a->io; ipl = UxCardLock(card->hw); card->e_tbl[e_no].next = 0; if (card->e_head) { card->e_tbl[card->e_tail].next = e_no; card->e_tail = e_no; } else { card->e_head = e_no; card->e_tail = e_no; } UxCardUnlock(card->hw, ipl); return; }
static byte get_assign(ADAPTER *a, word ref) { card_t *card; byte e_no; int ipl; card = a->io; ipl = UxCardLock(card->hw); e_no = (byte)card->assign; while (e_no) { if (card->e_tbl[e_no].assign_ref == ref) { break; } e_no = card->e_tbl[e_no].next; } UxCardUnlock(card->hw, ipl); return e_no; }
static void free_entity(ADAPTER *a, byte e_no) { card_t *card; int ipl; card = a->io; ipl = UxCardLock(card->hw); card->e_tbl[e_no].e = NULL; card->e_count--; UxCardUnlock(card->hw, ipl); return; }
long UxInterlockedDecrement(ux_diva_card_t *card, long *dst) { register volatile long *p; register long ret; int ipl; p =dst; ipl = UxCardLock(card); *p -= 1; ret = *p; UxCardUnlock(card,ipl); return(ret); }
static void assign_queue(ADAPTER * a, byte e_no, word ref) { card_t *card; int ipl; card = a->io; ipl = UxCardLock(card->hw); card->e_tbl[e_no].assign_ref = ref; card->e_tbl[e_no].next = card->assign; card->assign = e_no; UxCardUnlock(card->hw, ipl); return; }
static void next_req(ADAPTER * a) { card_t *card; int ipl; card = a->io; ipl = UxCardLock(card->hw); card->e_head = card->e_tbl[card->e_head].next; if (!card->e_head) { card->e_tail = 0; } UxCardUnlock(card->hw, ipl); return; }
/* * IDI request function for active cards */ static void request(card_t *card, ENTITY *e) { word *special_req; int i; int ipl; if (card->log_types & DIVAS_LOG_IDI) { DivasLogIdi(card, e, TRUE); } if (!e->Req) { special_req = (word *) e; switch (*special_req) { case REQ_REMOVE: return; case REQ_NAME: for (i=0; i < DIM(card->cfg.name); i++) { ((struct get_name_s *) e)->name[i] = card->cfg.name[i]; } return; case REQ_SERIAL: case REQ_XLOG: DPRINTF(("IDI: attempted REQ_SERIAL or REQ_XLOG")); return; default: return; } } ipl = UxCardLock(card->hw); if (!(e->Id & 0x1f)) { DPRINTF(("IDI: ASSIGN req")); for (i = 1; i < card->e_max; i++) { if (!card->e_tbl[i].e) { break; } } if (i == card->e_max) { DPRINTF(("IDI: request all ids in use (IDI req ignored)")); UxCardUnlock(card->hw, ipl); e->Rc = OUT_OF_RESOURCES; return; } card->e_tbl[i].e = e; card->e_count++; e->No = (byte) i; e->More = 0; e->RCurrent = 0xff; } else { i = e->No; } if (e->More & XBUSY) { DPRINTF(("IDI: request - entity is busy")); UxCardUnlock(card->hw, ipl); return; } e->More |= XBUSY; e->More &= ~ XMOREF; e->XCurrent = 0; e->XOffset = 0; card->e_tbl[i].next = 0; if(card->e_head) { card->e_tbl[card->e_tail].next = i; card->e_tail = i; } else { card->e_head = i; card->e_tail = i; } UxCardUnlock(card->hw, ipl); DivasScheduleRequestDpc(); return; }