Lines Matching defs:sea
217 #define STATUS (*(volatile u_char *)sea->maddr_cr_sr)
219 #define DATA (*(volatile u_char *)sea->maddr_dr)
287 void sea_send_scb(struct sea_softc *sea, struct sea_scb *scb);
288 void sea_reselect(struct sea_softc *sea);
289 int sea_select(struct sea_softc *sea, struct sea_scb *scb);
290 int sea_transfer_pio(struct sea_softc *sea, u_char *phase,
299 CFATTACH_DECL_NEW(sea, sizeof(struct sea_softc),
306 sea_queue_length(struct sea_softc *sea)
311 connected = sea->nexus ? 1 : 0;
312 for (scb = sea->ready_list.tqh_first, issued = 0; scb;
314 for (scb = sea->nexus_list.tqh_first, disconnected = 0; scb;
316 printf("%s: length: %d/%d/%d\n", device_xname(sea->sc_dev), connected,
389 struct sea_softc *sea = device_private(self);
390 struct scsipi_adapter *adapt = &sea->sc_adapter;
391 struct scsipi_channel *chan = &sea->sc_channel;
395 sea->sc_dev = self;
398 sea->maddr = ISA_HOLE_VADDR(ia->ia_iomem[0].ir_addr);
402 if (!memcmp((char *)sea->maddr + signatures[i].offset,
404 sea->type = signatures[i].type;
409 switch (sea->type) {
412 sea->maddr_cr_sr =
413 (void *) (((u_char *)sea->maddr) + 0x1a00);
414 sea->maddr_dr =
415 (void *) (((u_char *)sea->maddr) + 0x1c00);
418 sea->maddr_cr_sr =
419 (void *) (((u_char *)sea->maddr) + 0x1c00);
420 sea->maddr_dr =
421 (void *) (((u_char *)sea->maddr) + 0x1e00);
426 device_xname(sea->sc_dev), sea->maddr);
432 *((u_char *)sea->maddr + SEA_RAMOFFSET) = 0xa5;
433 *((u_char *)sea->maddr + SEA_RAMOFFSET + 1) = 0x5a;
435 if ((*((u_char *)sea->maddr + SEA_RAMOFFSET) != 0xa5) ||
436 (*((u_char *)sea->maddr + SEA_RAMOFFSET + 1) != 0x5a)) {
437 aprint_error_dev(sea->sc_dev, "board RAM failure\n");
441 sea_init(sea);
447 adapt->adapt_dev = sea->sc_dev;
449 adapt->adapt_openings = sea->numscbs;
463 chan->chan_id = sea->our_id;
468 sea->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq,
469 IST_EDGE, IPL_BIO, seaintr, sea);
474 config_found(self, &sea->sc_channel, scsiprint, CFARGS_NONE);
483 struct sea_softc *sea = arg;
497 aprint_error_dev(sea->sc_dev, "parity error\n");
503 sea_reselect(sea);
516 sea_init(struct sea_softc *sea)
527 switch (sea->type) {
529 sea->our_id = 7;
533 sea->our_id = 6;
536 sea->our_id_mask = 1 << sea->our_id;
539 sea->nexus = 0;
540 TAILQ_INIT(&sea->ready_list);
541 TAILQ_INIT(&sea->nexus_list);
542 TAILQ_INIT(&sea->free_list);
544 sea->busy[i] = 0x00;
547 sea->numscbs = SCB_TABLE_SIZE;
549 TAILQ_INSERT_TAIL(&sea->free_list, &sea->scb[i], chain);
563 struct sea_softc *sea = device_private(chan->chan_adapter->adapt_dev);
578 printf("%s: resetting\n", device_xname(sea->sc_dev));
585 scb = sea_get_scb(sea, flags);
608 sea_queue_length(sea);
613 sea_send_scb(sea, scb);
627 if (sea_poll(sea, xs, xs->timeout)) {
629 if (sea_poll(sea, xs, 2000))
635 sea_grow_scb(sea);
660 sea_get_scb(struct sea_softc *sea, int flags)
666 if ((scb = TAILQ_FIRST(&sea->free_list)) != NULL)
667 TAILQ_REMOVE(&sea->free_list, scb, chain);
682 sea_send_scb(struct sea_softc *sea, struct sea_scb *scb)
685 TAILQ_INSERT_TAIL(&sea->ready_list, scb, chain);
700 struct sea_softc *sea;
715 sea = device_lookup_private(&sea_cd, unit);
716 if (!sea)
719 if (!sea->nexus) {
724 for (scb = sea->ready_list.tqh_first; scb;
726 if ((sea->busy[scb->xs->xs_periph->periph_target] &
731 TAILQ_REMOVE(&sea->ready_list, scb, chain);
738 * On success, sea->nexus is set.
761 sea_reselect(sea);
765 if (sea_select(sea, scb)) {
767 TAILQ_INSERT_HEAD(&sea->ready_list,
774 if (!sea->nexus) {
778 sea_reselect(sea);
781 } /* if (!sea->nexus) */
784 if (sea->nexus) { /* we are connected. Do the task */
785 sea_information_transfer(sea);
802 sea_grow_scb(struct sea_softc *sea)
806 if (sea->numscbs == SEA_SCB_MAX) {
807 sea->sc_channel.chan_flags &= ~SCSIPI_CHAN_CANGROW;
815 TAILQ_INSERT_TAIL(&sea->free_list, scb, chain);
816 sea->numscbs++;
817 sea->sc_adapter.adapt_openings++;
820 sea_free_scb(struct sea_softc *sea, struct sea_scb *scb, int flags)
826 TAILQ_INSERT_HEAD(&sea->free_list, scb, chain);
836 struct sea_softc *sea =
855 sea_done(sea, scb);
860 sea_abort(sea, scb);
871 sea_reselect(struct sea_softc *sea)
883 printf("%s: wrong state 0x%x\n", device_xname(sea->sc_dev),
896 if (!(target_mask & sea->our_id_mask)) {
898 device_xname(sea->sc_dev), target_mask);
902 target_mask &= ~sea->our_id_mask;
916 sea_transfer_pio(sea, &phase, &len, &data);
920 device_xname(sea->sc_dev), msg[0]);
931 for (scb = sea->nexus_list.tqh_first; scb;
935 TAILQ_REMOVE(&sea->nexus_list, scb,
941 device_xname(sea->sc_dev), target_mask, lun);
956 sea_transfer_pio(sea, &phase, &len, &data);
958 sea->nexus = scb;
967 sea_transfer_pio(struct sea_softc *sea, u_char *phase, int *count, u_char **data)
984 device_xname(sea->sc_dev));
992 if (sea->type == FDOMAIN840)
1025 device_xname(sea->sc_dev));
1049 sea_select(struct sea_softc *sea, struct sea_scb *scb)
1057 DATA = sea->our_id_mask;
1066 printf("%s: arbitration lost\n", device_xname(sea->sc_dev));
1070 device_xname(sea->sc_dev));
1079 sea->our_id_mask);
1126 sea_transfer_pio(sea, &phase, &len, &data);
1130 device_xname(sea->sc_dev));
1132 sea->nexus = scb;
1133 sea->busy[scb->xs->xs_periph->periph_target] |=
1145 sea_abort(struct sea_softc *sea, struct sea_scb *scb)
1156 for (tmp = sea->ready_list.tqh_first; tmp; tmp = tmp->chain.tqe_next)
1158 TAILQ_REMOVE(&sea->ready_list, scb, chain);
1167 if (sea->nexus)
1175 for (tmp = sea->nexus_list.tqh_first; tmp;
1178 if (sea_select(sea, scb))
1186 sea_transfer_pio(sea, &phase, &len, &msgptr);
1188 for (tmp = sea->nexus_list.tqh_first; tmp;
1191 TAILQ_REMOVE(&sea->nexus_list,
1204 sea_done(struct sea_softc *sea, struct sea_scb *scb)
1221 sea_free_scb(sea, scb, xs->xs_control);
1229 sea_poll(struct sea_softc *sea, struct scsipi_xfer *xs, int count)
1252 sea_information_transfer(struct sea_softc *sea)
1260 struct sea_scb *scb = sea->nexus;
1267 device_xname(sea->sc_dev));
1274 device_xname(sea->sc_dev));
1276 sea->nexus = NULL;
1279 sea_done(sea, scb);
1288 if (sea->type == FDOMAIN840)
1300 device_xname(sea->sc_dev));
1316 device_xname(sea->sc_dev));
1319 if (sea->type == FDOMAIN840)
1336 "2" (sea->maddr_dr));
1353 "2" (sea->maddr_dr));
1365 sea_transfer_pio(sea, &phase, &scb->datalen,
1372 sea_transfer_pio(sea, &phase, &len, &data);
1378 printf("sea: command aborted by target\n");
1380 sea_done(sea, scb);
1384 sea->nexus = NULL;
1386 sea->busy[scb->xs->xs_periph->periph_target] &=
1389 sea_done(sea, scb);
1393 device_xname(sea->sc_dev));
1397 TAILQ_INSERT_TAIL(&sea->nexus_list,
1399 sea->nexus = NULL;
1415 device_xname(sea->sc_dev), tmp);
1422 /* sea->last_message = msgout; */
1423 sea_transfer_pio(sea, &phase, &len, &data);
1426 device_xname(sea->sc_dev));
1428 sea->busy[scb->xs->xs_periph->periph_target] &=
1430 sea->nexus = NULL;
1434 sea_done(sea, scb);
1442 sea_transfer_pio(sea, &phase, &len, &data);
1447 sea_transfer_pio(sea, &phase, &len, &data);
1451 printf("sea: unknown phase\n");
1456 printf("%s: timeout in data transfer\n", device_xname(sea->sc_dev));
1459 sea_done(sea, scb);