Home | History | Annotate | Download | only in hil

Lines Matching refs:sc

95 static int	send_device_cmd(struct hil_softc *sc, u_int device, u_int cmd);
102 #define hil_process_pending(sc) wakeup(&(sc)->sc_pending)
105 hilwait(struct hil_softc *sc)
111 if ((bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT) &
120 hildatawait(struct hil_softc *sc)
126 if ((bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT) &
139 hil_attach(struct hil_softc *sc, int *hil_is_console)
142 rnd_attach_source(&sc->sc_rndsource, device_xname(sc->sc_dev),
150 sc->sc_cmdending = 0;
151 sc->sc_actdev = sc->sc_cmddev = 0;
152 sc->sc_cmddone = 0;
153 sc->sc_cmdbp = sc->sc_cmdbuf;
154 sc->sc_pollbp = sc->sc_pollbuf;
155 sc->sc_console = hil_is_console;
156 sc->sc_status = HIL_STATUS_BUSY;
195 struct hil_softc *sc = device_private(self);
199 sc->sc_status = HIL_STATUS_BUSY;
206 send_hil_cmd(sc, HIL_WRITELPCTRL, &db, 1, NULL);
213 if (bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT) &
215 db = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
226 if (send_hil_cmd(sc, HIL_READLPSTAT, NULL, 0, &db) == 0) {
240 sc->sc_pending = 0;
248 if (kthread_create(PRI_NONE, 0, NULL, hil_thread, sc, &sc->sc_thread,
249 "%s", device_xname(sc->sc_dev)) != 0) {
257 send_hil_cmd(sc, HIL_INTON, NULL, 0, NULL);
262 sc->sc_status = HIL_STATUS_READY;
263 hil_process_pending(sc);
273 struct hil_softc *sc = v;
276 stat = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT);
285 c = bus_space_read_1(sc->sc_bst, sc->sc_bsh,
289 hil_process_int(sc, stat, c);
291 if (sc->sc_status != HIL_STATUS_BUSY)
292 hil_process_pending(sc);
294 rnd_add_uint32(&sc->sc_rndsource, (stat << 8) | c);
300 hil_process_int(struct hil_softc *sc, uint8_t stat, uint8_t c)
308 sc->sc_cmddone = 1;
311 sc->sc_pending = HIL_PENDING_RECONFIG;
314 sc->sc_pending = HIL_PENDING_UNPLUGGED;
321 child = sc->sc_devices[sc->sc_actdev];
326 sc->sc_pollbp
327 - sc->sc_pollbuf,
328 sc->sc_pollbuf);
331 sc->sc_cmdending = 1;
333 sc->sc_actdev = 0;
336 sc->sc_actdev = (c & HIL_DEVMASK);
337 sc->sc_pollbp = sc->sc_pollbuf;
339 if (sc->sc_cmddev == (c & HIL_DEVMASK)) {
340 sc->sc_cmdbp = sc->sc_cmdbuf;
341 sc->sc_actdev = 0;
347 if (sc->sc_actdev != 0) /* Collecting poll data */
348 *sc->sc_pollbp++ = c;
350 if (sc->sc_cmddev != 0) { /* Collecting cmd data */
351 if (sc->sc_cmdending) {
352 sc->sc_cmddone = 1;
353 sc->sc_cmdending = 0;
355 *sc->sc_cmdbp++ = c;
367 hil_process_poll(struct hil_softc *sc, uint8_t stat, uint8_t c)
374 sc->sc_cmddone = 1;
382 sc->sc_pending = HIL_PENDING_RECONFIG;
390 send_hil_cmd(sc, HIL_WRITEKBDSADR, &db,
399 sc->sc_pending = HIL_PENDING_UNPLUGGED;
407 sc->sc_cmdending = 1;
409 sc->sc_actdev = 0;
413 sc->sc_actdev = (c & HIL_DEVMASK);
414 sc->sc_pollbp = sc->sc_pollbuf;
417 if (sc->sc_cmddev == (c & HIL_DEVMASK)) {
418 sc->sc_cmdbp = sc->sc_cmdbuf;
419 sc->sc_actdev = 0;
425 if (sc->sc_actdev != 0) /* Collecting poll data */
428 if (sc->sc_cmddev != 0) { /* Discarding cmd data */
429 if (sc->sc_cmdending) {
430 sc->sc_cmddone = 1;
431 sc->sc_cmdending = 0;
444 struct hil_softc *sc = arg;
449 if (sc->sc_pending == 0) {
451 (void)tsleep(&sc->sc_pending, PWAIT, "hil_event", 0);
455 switch (sc->sc_pending) {
457 sc->sc_pending = 0;
458 hilconfig(sc, sc->sc_maxdev);
461 sc->sc_pending = 0;
462 hilempty(sc);
486 hilconfig(struct hil_softc *sc, u_int knowndevs)
498 send_hil_cmd(sc, HIL_READLPSTAT, NULL, 0, &db);
499 sc->sc_maxdev = db & LPS_DEVMASK;
501 printf("%s: %d device(s)\n", device_xname(sc->sc_dev), sc->sc_maxdev);
508 send_hil_cmd(sc, HIL_WRITEKBDSADR, &db, 1, NULL);
513 for (id = knowndevs + 1; id <= sc->sc_maxdev; id++) {
517 if (send_device_cmd(sc, id, HIL_IDENTIFY) != 0) {
518 aprint_normal_dev(sc->sc_dev,
523 len = sc->sc_cmdbp - sc->sc_cmdbuf;
527 device_xname(sc->sc_dev), id);
534 if (sc->sc_cmdbuf[0] >= hd->minid &&
535 sc->sc_cmdbuf[0] <= hd->maxid) {
537 ha.ha_console = *sc->sc_console;
542 memcpy(ha.ha_info, sc->sc_cmdbuf, len);
544 sc->sc_devices[id] =
545 config_found(sc->sc_dev, &ha, hildevprint,
553 if (sc->sc_devices[id] != NULL &&
556 *sc->sc_console = 1;
564 for (id = sc->sc_maxdev + 1; id < NHILD; id++) {
565 if (sc->sc_devices[id] != NULL)
566 config_detach(sc->sc_devices[id],
568 sc->sc_devices[id] = NULL;
571 sc->sc_cmdbp = sc->sc_cmdbuf;
581 hilempty(struct hil_softc *sc)
593 if (send_hil_cmd(sc, HIL_READLPSTAT, NULL, 0, &db) == 0) {
603 sc->sc_maxdev = 0;
606 send_hil_cmd(sc, HIL_READLPSTAT, NULL, 0, &db);
607 oldmaxdev = sc->sc_maxdev;
608 sc->sc_maxdev = db & LPS_DEVMASK;
610 if (sc->sc_maxdev != 0) {
615 hilconfig(sc, oldmaxdev);
623 for (id = sc->sc_maxdev + 1; id < NHILD; id++) {
624 if (sc->sc_devices[id] != NULL)
625 config_detach(sc->sc_devices[id],
627 sc->sc_devices[id] = NULL;
630 sc->sc_cmdbp = sc->sc_cmdbuf;
644 send_hil_cmd(struct hil_softc *sc, u_int cmd, uint8_t *data, u_int dlen,
652 if (hilwait(sc) == 0) {
655 device_xname(sc->sc_dev));
661 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, cmd);
663 hilwait(sc);
664 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, *data++);
669 if (hildatawait(sc) == 0) {
672 device_xname(sc->sc_dev));
676 status = bus_space_read_1(scsc->sc_bsh,
678 *rdata = bus_space_read_1(sc->sc_bst, sc->sc_bsh,
697 send_device_cmd(struct hil_softc *sc, u_int device, u_int cmd)
702 polloff(sc);
704 sc->sc_cmdbp = sc->sc_cmdbuf;
705 sc->sc_cmddev = device;
707 if (hilwait(sc) == 0) {
710 device_xname(sc->sc_dev), device);
719 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_STARTCMD);
720 hilwait(sc);
721 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, 8 + device);
722 hilwait(sc);
723 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, cmd);
724 hilwait(sc);
725 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, HIL_TIMEOUT);
730 hilwait(sc);
731 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_TRIGGER);
732 sc->sc_cmddone = 0;
734 if (hildatawait(sc) == 0) {
737 device_xname(sc->sc_dev), device);
742 status = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT);
743 c = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
745 hil_process_int(sc, status, c);
746 } while (sc->sc_cmddone == 0);
748 sc->sc_cmddev = 0;
750 pollon(sc);
758 struct hil_softc *sc = device_private(device_parent(hdsc->sc_dev));
763 if ((rc = send_device_cmd(sc, hdsc->sc_code, cmd)) == 0) {
768 *outlen = uimin(*outlen, sc->sc_cmdbp - sc->sc_cmdbuf);
769 memcpy(outbuf, sc->sc_cmdbuf, *outlen);
781 polloff(struct hil_softc *sc)
785 if (hilwait(sc) == 0)
791 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_SETARR);
792 hilwait(sc);
793 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, 0);
798 hilwait(sc);
799 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_READLPCTRL);
800 hildatawait(sc);
801 db = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
803 hilwait(sc);
804 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_WRITELPCTRL);
805 hilwait(sc);
806 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, db);
812 hilwait(sc);
813 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_READBUSY);
814 hildatawait(sc);
815 db = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
818 sc->sc_cmddone = 0;
819 sc->sc_cmddev = 0;
823 pollon(struct hil_softc *sc)
827 if (hilwait(sc) == 0)
833 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_READLPCTRL);
834 hildatawait(sc);
835 db = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
837 hilwait(sc);
838 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_WRITELPCTRL);
839 hilwait(sc);
840 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, db);
845 hilwait(sc);
846 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_CMD, HIL_SETARR);
847 hilwait(sc);
848 bus_space_write_1(sc->sc_bst, sc->sc_bsh, HILP_DATA, 0);
853 hil_set_poll(struct hil_softc *sc, int on)
856 pollon(sc);
858 hil_process_pending(sc);
859 send_hil_cmd(sc, HIL_INTON, NULL, 0, NULL);
866 struct hil_softc *sc = device_private(device_parent(hdsc->sc_dev));
869 s = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_STAT);
873 c = bus_space_read_1(sc->sc_bst, sc->sc_bsh, HILP_DATA);
876 if (hil_process_poll(sc, s, c)) {
878 if (sc->sc_actdev == hdsc->sc_code) {