1 /* $NetBSD: atppc.c,v 1.19 2005/12/11 12:21:25 christos Exp $ */ 2 3 /* 4 * Copyright (c) 2001 Alcove - Nicolas Souchu 5 * Copyright (c) 2003, 2004 Gary Thorpe <gathorpe@users.sourceforge.net> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * FreeBSD: src/sys/isa/ppc.c,v 1.26.2.5 2001/10/02 05:21:45 nsouch Exp 30 * 31 */ 32 33 #include <sys/cdefs.h> 34 __KERNEL_RCSID(0, "$NetBSD: atppc.c,v 1.19 2005/12/11 12:21:25 christos Exp $"); 35 36 #include "opt_atppc.h" 37 38 #include <sys/types.h> 39 #include <sys/param.h> 40 #include <sys/kernel.h> 41 #include <sys/device.h> 42 #include <sys/malloc.h> 43 #include <sys/proc.h> 44 #include <sys/systm.h> 45 #include <sys/vnode.h> 46 #include <sys/syslog.h> 47 48 #include <machine/bus.h> 49 /*#include <machine/intr.h>*/ 50 51 #include <dev/isa/isareg.h> 52 53 #include <dev/ic/atppcreg.h> 54 #include <dev/ic/atppcvar.h> 55 56 #include <dev/ppbus/ppbus_conf.h> 57 #include <dev/ppbus/ppbus_msq.h> 58 #include <dev/ppbus/ppbus_io.h> 59 #include <dev/ppbus/ppbus_var.h> 60 61 #ifdef ATPPC_DEBUG 62 int atppc_debug = 1; 63 #endif 64 65 #ifdef ATPPC_VERBOSE 66 int atppc_verbose = 1; 67 #endif 68 69 /* List of supported chipsets detection routines */ 70 static int (*chipset_detect[])(struct atppc_softc *) = { 71 /* XXX Add these LATER: maybe as seperate devices? 72 atppc_pc873xx_detect, 73 atppc_smc37c66xgt_detect, 74 atppc_w83877f_detect, 75 atppc_smc37c935_detect, 76 */ 77 NULL 78 }; 79 80 81 /* Prototypes for functions. */ 82 83 /* Print function for config_found() */ 84 static int atppc_print(void *, const char *); 85 86 /* Detection routines */ 87 static int atppc_detect_fifo(struct atppc_softc *); 88 static int atppc_detect_chipset(struct atppc_softc *); 89 static int atppc_detect_generic(struct atppc_softc *); 90 91 /* Routines for ppbus interface (bus + device) */ 92 static int atppc_read(struct device *, char *, int, int, size_t *); 93 static int atppc_write(struct device *, char *, int, int, size_t *); 94 static int atppc_setmode(struct device *, int); 95 static int atppc_getmode(struct device *); 96 static int atppc_check_epp_timeout(struct device *); 97 static void atppc_reset_epp_timeout(struct device *); 98 static void atppc_ecp_sync(struct device *); 99 static int atppc_exec_microseq(struct device *, struct ppbus_microseq * *); 100 static u_int8_t atppc_io(struct device *, int, u_char *, int, u_char); 101 static int atppc_read_ivar(struct device *, int, unsigned int *); 102 static int atppc_write_ivar(struct device *, int, unsigned int *); 103 static int atppc_add_handler(struct device *, void (*)(void *), void *); 104 static int atppc_remove_handler(struct device *, void (*)(void *)); 105 106 /* Utility functions */ 107 108 /* Functions to read bytes into device's input buffer */ 109 static void atppc_nibble_read(struct atppc_softc * const); 110 static void atppc_byte_read(struct atppc_softc * const); 111 static void atppc_epp_read(struct atppc_softc * const); 112 static void atppc_ecp_read(struct atppc_softc * const); 113 static void atppc_ecp_read_dma(struct atppc_softc *, unsigned int *, 114 unsigned char); 115 static void atppc_ecp_read_pio(struct atppc_softc *, unsigned int *, 116 unsigned char); 117 static void atppc_ecp_read_error(struct atppc_softc *, const unsigned int); 118 119 120 /* Functions to write bytes to device's output buffer */ 121 static void atppc_std_write(struct atppc_softc * const); 122 static void atppc_epp_write(struct atppc_softc * const); 123 static void atppc_fifo_write(struct atppc_softc * const); 124 static void atppc_fifo_write_dma(struct atppc_softc * const, unsigned char, 125 unsigned char); 126 static void atppc_fifo_write_pio(struct atppc_softc * const, unsigned char, 127 unsigned char); 128 static void atppc_fifo_write_error(struct atppc_softc * const, 129 const unsigned int); 130 131 /* Miscellaneous */ 132 static int atppc_poll_str(const struct atppc_softc * const, const u_int8_t, 133 const u_int8_t); 134 static int atppc_wait_interrupt(struct atppc_softc * const, const caddr_t, 135 const u_int8_t); 136 137 138 /* 139 * Generic attach and detach functions for atppc device. If sc_dev_ok in soft 140 * configuration data is not ATPPC_ATTACHED, these should be skipped altogether. 141 */ 142 143 /* Soft configuration attach for atppc */ 144 void 145 atppc_sc_attach(struct atppc_softc *lsc) 146 { 147 /* Adapter used to configure ppbus device */ 148 struct parport_adapter sc_parport_adapter; 149 char buf[64]; 150 151 ATPPC_LOCK_INIT(lsc); 152 153 /* Probe and set up chipset */ 154 if (atppc_detect_chipset(lsc) != 0) { 155 if (atppc_detect_generic(lsc) != 0) { 156 ATPPC_DPRINTF(("%s: Error detecting chipset\n", 157 lsc->sc_dev.dv_xname)); 158 } 159 } 160 161 /* Probe and setup FIFO queue */ 162 if (atppc_detect_fifo(lsc) == 0) { 163 printf("%s: FIFO <depth,wthr,rthr>=<%d,%d,%d>\n", 164 lsc->sc_dev.dv_xname, lsc->sc_fifo, lsc->sc_wthr, 165 lsc->sc_rthr); 166 } 167 168 /* Print out chipset capabilities */ 169 bitmask_snprintf(lsc->sc_has, "\20\1INTR\2DMA\3FIFO\4PS2\5ECP\6EPP", 170 buf, sizeof(buf)); 171 printf("%s: capabilities=%s\n", lsc->sc_dev.dv_xname, buf); 172 173 /* Initialize device's buffer pointers */ 174 lsc->sc_outb = lsc->sc_outbstart = lsc->sc_inb = lsc->sc_inbstart 175 = NULL; 176 lsc->sc_inb_nbytes = lsc->sc_outb_nbytes = 0; 177 178 /* Last configuration step: set mode to standard mode */ 179 if (atppc_setmode(&(lsc->sc_dev), PPBUS_COMPATIBLE) != 0) { 180 ATPPC_DPRINTF(("%s: unable to initialize mode.\n", 181 lsc->sc_dev.dv_xname)); 182 } 183 184 #if defined (MULTIPROCESSOR) || defined (LOCKDEBUG) 185 /* Initialize lock structure */ 186 simple_lock_init(&(lsc->sc_lock)); 187 #endif 188 189 /* Set up parport_adapter structure */ 190 191 /* Set capabilites */ 192 sc_parport_adapter.capabilities = 0; 193 if (lsc->sc_has & ATPPC_HAS_INTR) { 194 sc_parport_adapter.capabilities |= PPBUS_HAS_INTR; 195 } 196 if (lsc->sc_has & ATPPC_HAS_DMA) { 197 sc_parport_adapter.capabilities |= PPBUS_HAS_DMA; 198 } 199 if (lsc->sc_has & ATPPC_HAS_FIFO) { 200 sc_parport_adapter.capabilities |= PPBUS_HAS_FIFO; 201 } 202 if (lsc->sc_has & ATPPC_HAS_PS2) { 203 sc_parport_adapter.capabilities |= PPBUS_HAS_PS2; 204 } 205 if (lsc->sc_has & ATPPC_HAS_EPP) { 206 sc_parport_adapter.capabilities |= PPBUS_HAS_EPP; 207 } 208 if (lsc->sc_has & ATPPC_HAS_ECP) { 209 sc_parport_adapter.capabilities |= PPBUS_HAS_ECP; 210 } 211 212 /* Set function pointers */ 213 sc_parport_adapter.parport_io = atppc_io; 214 sc_parport_adapter.parport_exec_microseq = atppc_exec_microseq; 215 sc_parport_adapter.parport_reset_epp_timeout = 216 atppc_reset_epp_timeout; 217 sc_parport_adapter.parport_setmode = atppc_setmode; 218 sc_parport_adapter.parport_getmode = atppc_getmode; 219 sc_parport_adapter.parport_ecp_sync = atppc_ecp_sync; 220 sc_parport_adapter.parport_read = atppc_read; 221 sc_parport_adapter.parport_write = atppc_write; 222 sc_parport_adapter.parport_read_ivar = atppc_read_ivar; 223 sc_parport_adapter.parport_write_ivar = atppc_write_ivar; 224 sc_parport_adapter.parport_dma_malloc = lsc->sc_dma_malloc; 225 sc_parport_adapter.parport_dma_free = lsc->sc_dma_free; 226 sc_parport_adapter.parport_add_handler = atppc_add_handler; 227 sc_parport_adapter.parport_remove_handler = atppc_remove_handler; 228 229 /* Initialize handler list, may be added to by grandchildren */ 230 SLIST_INIT(&(lsc->sc_handler_listhead)); 231 232 /* Initialize interrupt state */ 233 lsc->sc_irqstat = ATPPC_IRQ_NONE; 234 lsc->sc_ecr_intr = lsc->sc_ctr_intr = lsc->sc_str_intr = 0; 235 236 /* Disable DMA/interrupts (each ppbus driver selects usage itself) */ 237 lsc->sc_use = 0; 238 239 /* Configure child of the device. */ 240 lsc->child = config_found(&(lsc->sc_dev), &(sc_parport_adapter), 241 atppc_print); 242 243 return; 244 } 245 246 /* Soft configuration detach */ 247 int 248 atppc_sc_detach(struct atppc_softc *lsc, int flag) 249 { 250 struct device *dev = (struct device *)lsc; 251 252 /* Detach children devices */ 253 if (config_detach(lsc->child, flag) && !(flag & DETACH_QUIET)) { 254 printf("%s not able to detach child device, ", dev->dv_xname); 255 256 if (!(flag & DETACH_FORCE)) { 257 printf("cannot detach\n"); 258 return 1; 259 } else { 260 printf("continuing (DETACH_FORCE)\n"); 261 } 262 } 263 264 if (!(flag & DETACH_QUIET)) 265 printf("%s detached", dev->dv_xname); 266 267 return 0; 268 } 269 270 /* Used by config_found() to print out device information */ 271 static int 272 atppc_print(void *aux, const char *name) 273 { 274 /* Print out something on failure. */ 275 if (name != NULL) { 276 printf("%s: child devices", name); 277 return UNCONF; 278 } 279 280 return QUIET; 281 } 282 283 /* 284 * Machine independent detection routines for atppc driver. 285 */ 286 287 /* Detect parallel port I/O port: taken from FreeBSD code directly. */ 288 int 289 atppc_detect_port(bus_space_tag_t iot, bus_space_handle_t ioh) 290 { 291 /* 292 * Much shorter than scheme used by lpt_isa_probe() and lpt_port_test() 293 * in original lpt driver. 294 * Write to data register common to all controllers and read back the 295 * values. Also tests control and status registers. 296 */ 297 298 /* 299 * Cannot use convenient macros because the device's config structure 300 * may not have been created yet: major change from FreeBSD code. 301 */ 302 303 int rval; 304 u_int8_t ctr_sav, dtr_sav, str_sav; 305 306 /* Store writtable registers' values and test if they can be read */ 307 str_sav = bus_space_read_1(iot, ioh, ATPPC_SPP_STR); 308 ctr_sav = bus_space_read_1(iot, ioh, ATPPC_SPP_CTR); 309 dtr_sav = bus_space_read_1(iot, ioh, ATPPC_SPP_DTR); 310 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 311 BUS_SPACE_BARRIER_READ); 312 313 /* 314 * Ensure PS2 ports in output mode, also read back value of control 315 * register. 316 */ 317 bus_space_write_1(iot, ioh, ATPPC_SPP_CTR, 0x0c); 318 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 319 BUS_SPACE_BARRIER_WRITE); 320 321 if (bus_space_read_1(iot, ioh, ATPPC_SPP_CTR) != 0x0c) { 322 rval = 0; 323 } else { 324 /* 325 * Test if two values can be written and read from the data 326 * register. 327 */ 328 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 329 BUS_SPACE_BARRIER_READ); 330 bus_space_write_1(iot, ioh, ATPPC_SPP_DTR, 0xaa); 331 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 332 BUS_SPACE_BARRIER_WRITE); 333 if (bus_space_read_1(iot, ioh, ATPPC_SPP_DTR) != 0xaa) { 334 rval = 1; 335 } else { 336 /* Second value to test */ 337 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 338 BUS_SPACE_BARRIER_READ); 339 bus_space_write_1(iot, ioh, ATPPC_SPP_DTR, 0x55); 340 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 341 BUS_SPACE_BARRIER_WRITE); 342 if (bus_space_read_1(iot, ioh, ATPPC_SPP_DTR) != 0x55) { 343 rval = 1; 344 } else { 345 rval = 0; 346 } 347 } 348 349 } 350 351 /* Restore registers */ 352 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 353 BUS_SPACE_BARRIER_READ); 354 bus_space_write_1(iot, ioh, ATPPC_SPP_CTR, ctr_sav); 355 bus_space_write_1(iot, ioh, ATPPC_SPP_DTR, dtr_sav); 356 bus_space_write_1(iot, ioh, ATPPC_SPP_STR, str_sav); 357 bus_space_barrier(iot, ioh, 0, IO_LPTSIZE, 358 BUS_SPACE_BARRIER_WRITE); 359 360 return rval; 361 } 362 363 /* Detect parallel port chipset. */ 364 static int 365 atppc_detect_chipset(struct atppc_softc *atppc) 366 { 367 /* Try each detection routine. */ 368 int i, mode; 369 for (i = 0; chipset_detect[i] != NULL; i++) { 370 if ((mode = chipset_detect[i](atppc)) != -1) { 371 atppc->sc_mode = mode; 372 return 0; 373 } 374 } 375 376 return 1; 377 } 378 379 /* Detect generic capabilities. */ 380 static int 381 atppc_detect_generic(struct atppc_softc *atppc) 382 { 383 u_int8_t ecr_sav = atppc_r_ecr(atppc); 384 u_int8_t ctr_sav = atppc_r_ctr(atppc); 385 u_int8_t str_sav = atppc_r_str(atppc); 386 u_int8_t tmp; 387 atppc_barrier_r(atppc); 388 389 /* Default to generic */ 390 atppc->sc_type = ATPPC_TYPE_GENERIC; 391 atppc->sc_model = GENERIC; 392 393 /* Check for ECP */ 394 tmp = atppc_r_ecr(atppc); 395 atppc_barrier_r(atppc); 396 if ((tmp & ATPPC_FIFO_EMPTY) && !(tmp & ATPPC_FIFO_FULL)) { 397 atppc_w_ecr(atppc, 0x34); 398 atppc_barrier_w(atppc); 399 tmp = atppc_r_ecr(atppc); 400 atppc_barrier_r(atppc); 401 if (tmp == 0x35) { 402 atppc->sc_has |= ATPPC_HAS_ECP; 403 } 404 } 405 406 /* Allow search for SMC style ECP+EPP mode */ 407 if (atppc->sc_has & ATPPC_HAS_ECP) { 408 atppc_w_ecr(atppc, ATPPC_ECR_EPP); 409 atppc_barrier_w(atppc); 410 } 411 /* Check for EPP by checking for timeout bit */ 412 if (atppc_check_epp_timeout(&(atppc->sc_dev)) != 0) { 413 atppc->sc_has |= ATPPC_HAS_EPP; 414 atppc->sc_epp = ATPPC_EPP_1_9; 415 if (atppc->sc_has & ATPPC_HAS_ECP) { 416 /* SMC like chipset found */ 417 atppc->sc_model = SMC_LIKE; 418 atppc->sc_type = ATPPC_TYPE_SMCLIKE; 419 } 420 } 421 422 /* Detect PS2 mode */ 423 if (atppc->sc_has & ATPPC_HAS_ECP) { 424 /* Put ECP port into PS2 mode */ 425 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 426 atppc_barrier_w(atppc); 427 } 428 /* Put PS2 port in input mode: writes should not be readable */ 429 atppc_w_ctr(atppc, 0x20); 430 atppc_barrier_w(atppc); 431 /* 432 * Write two values to data port: if neither are read back, 433 * bidirectional mode is functional. 434 */ 435 atppc_w_dtr(atppc, 0xaa); 436 atppc_barrier_w(atppc); 437 tmp = atppc_r_dtr(atppc); 438 atppc_barrier_r(atppc); 439 if (tmp != 0xaa) { 440 atppc_w_dtr(atppc, 0x55); 441 atppc_barrier_w(atppc); 442 tmp = atppc_r_dtr(atppc); 443 atppc_barrier_r(atppc); 444 if (tmp != 0x55) { 445 atppc->sc_has |= ATPPC_HAS_PS2; 446 } 447 } 448 449 /* Restore to previous state */ 450 atppc_w_ecr(atppc, ecr_sav); 451 atppc_w_ctr(atppc, ctr_sav); 452 atppc_w_str(atppc, str_sav); 453 atppc_barrier_w(atppc); 454 455 return 0; 456 } 457 458 /* 459 * Detect parallel port FIFO: taken from FreeBSD code directly. 460 */ 461 static int 462 atppc_detect_fifo(struct atppc_softc *atppc) 463 { 464 #ifdef ATPPC_DEBUG 465 struct device *dev = (struct device *)atppc; 466 #endif 467 u_int8_t ecr_sav; 468 u_int8_t ctr_sav; 469 u_int8_t str_sav; 470 u_int8_t cc; 471 short i; 472 473 /* If there is no ECP mode, we cannot config a FIFO */ 474 if (!(atppc->sc_has & ATPPC_HAS_ECP)) { 475 return (EINVAL); 476 } 477 478 /* save registers */ 479 ecr_sav = atppc_r_ecr(atppc); 480 ctr_sav = atppc_r_ctr(atppc); 481 str_sav = atppc_r_str(atppc); 482 atppc_barrier_r(atppc); 483 484 /* Enter ECP configuration mode, no interrupt, no DMA */ 485 atppc_w_ecr(atppc, (ATPPC_ECR_CFG | ATPPC_SERVICE_INTR) & 486 ~ATPPC_ENABLE_DMA); 487 atppc_barrier_w(atppc); 488 489 /* read PWord size - transfers in FIFO mode must be PWord aligned */ 490 atppc->sc_pword = (atppc_r_cnfgA(atppc) & ATPPC_PWORD_MASK); 491 atppc_barrier_r(atppc); 492 493 /* XXX 16 and 32 bits implementations not supported */ 494 if (atppc->sc_pword != ATPPC_PWORD_8) { 495 ATPPC_DPRINTF(("%s(%s): FIFO PWord(%d) not supported.\n", 496 __func__, dev->dv_xname, atppc->sc_pword)); 497 goto error; 498 } 499 500 /* Byte mode, reverse direction, no interrupt, no DMA */ 501 atppc_w_ecr(atppc, ATPPC_ECR_PS2 | ATPPC_SERVICE_INTR); 502 atppc_w_ctr(atppc, (ctr_sav & ~IRQENABLE) | PCD); 503 /* enter ECP test mode, no interrupt, no DMA */ 504 atppc_w_ecr(atppc, ATPPC_ECR_TST | ATPPC_SERVICE_INTR); 505 atppc_barrier_w(atppc); 506 507 /* flush the FIFO */ 508 for (i = 0; i < 1024; i++) { 509 atppc_r_fifo(atppc); 510 atppc_barrier_r(atppc); 511 cc = atppc_r_ecr(atppc); 512 atppc_barrier_r(atppc); 513 if (cc & ATPPC_FIFO_EMPTY) 514 break; 515 } 516 if (i >= 1024) { 517 ATPPC_DPRINTF(("%s(%s): cannot flush FIFO.\n", __func__, 518 dev->dv_xname)); 519 goto error; 520 } 521 522 /* Test mode, enable interrupts, no DMA */ 523 atppc_w_ecr(atppc, ATPPC_ECR_TST); 524 atppc_barrier_w(atppc); 525 526 /* Determine readIntrThreshold - fill FIFO until serviceIntr is set */ 527 for (i = atppc->sc_rthr = atppc->sc_fifo = 0; i < 1024; i++) { 528 atppc_w_fifo(atppc, (char)i); 529 atppc_barrier_w(atppc); 530 cc = atppc_r_ecr(atppc); 531 atppc_barrier_r(atppc); 532 if ((atppc->sc_rthr == 0) && (cc & ATPPC_SERVICE_INTR)) { 533 /* readThreshold reached */ 534 atppc->sc_rthr = i + 1; 535 } 536 if (cc & ATPPC_FIFO_FULL) { 537 atppc->sc_fifo = i + 1; 538 break; 539 } 540 } 541 if (i >= 1024) { 542 ATPPC_DPRINTF(("%s(%s): cannot fill FIFO.\n", __func__, 543 dev->dv_xname)); 544 goto error; 545 } 546 547 /* Change direction */ 548 atppc_w_ctr(atppc, (ctr_sav & ~IRQENABLE) & ~PCD); 549 atppc_barrier_w(atppc); 550 551 /* Clear the serviceIntr bit we've already set in the above loop */ 552 atppc_w_ecr(atppc, ATPPC_ECR_TST); 553 atppc_barrier_w(atppc); 554 555 /* Determine writeIntrThreshold - empty FIFO until serviceIntr is set */ 556 for (atppc->sc_wthr = 0; i > -1; i--) { 557 cc = atppc_r_fifo(atppc); 558 atppc_barrier_r(atppc); 559 if (cc != (char)(atppc->sc_fifo - i - 1)) { 560 ATPPC_DPRINTF(("%s(%s): invalid data in FIFO.\n", 561 __func__, dev->dv_xname)); 562 goto error; 563 } 564 565 cc = atppc_r_ecr(atppc); 566 atppc_barrier_r(atppc); 567 if ((atppc->sc_wthr == 0) && (cc & ATPPC_SERVICE_INTR)) { 568 /* writeIntrThreshold reached */ 569 atppc->sc_wthr = atppc->sc_fifo - i; 570 } 571 572 if (i > 0 && (cc & ATPPC_FIFO_EMPTY)) { 573 /* If FIFO empty before the last byte, error */ 574 ATPPC_DPRINTF(("%s(%s): data lost in FIFO.\n", __func__, 575 dev->dv_xname)); 576 goto error; 577 } 578 } 579 580 /* FIFO must be empty after the last byte */ 581 cc = atppc_r_ecr(atppc); 582 atppc_barrier_r(atppc); 583 if (!(cc & ATPPC_FIFO_EMPTY)) { 584 ATPPC_DPRINTF(("%s(%s): cannot empty the FIFO.\n", __func__, 585 dev->dv_xname)); 586 goto error; 587 } 588 589 /* Restore original registers */ 590 atppc_w_ctr(atppc, ctr_sav); 591 atppc_w_str(atppc, str_sav); 592 atppc_w_ecr(atppc, ecr_sav); 593 atppc_barrier_w(atppc); 594 595 /* Update capabilities */ 596 atppc->sc_has |= ATPPC_HAS_FIFO; 597 598 return 0; 599 600 error: 601 /* Restore original registers */ 602 atppc_w_ctr(atppc, ctr_sav); 603 atppc_w_str(atppc, str_sav); 604 atppc_w_ecr(atppc, ecr_sav); 605 atppc_barrier_w(atppc); 606 607 return (EINVAL); 608 } 609 610 /* Interrupt handler for atppc device: wakes up read/write functions */ 611 int 612 atppcintr(void *arg) 613 { 614 struct atppc_softc *atppc = (struct atppc_softc *)arg; 615 struct device *dev = &atppc->sc_dev; 616 int claim = 1; 617 enum { NONE, READER, WRITER } wake_up = NONE; 618 int s; 619 620 s = splatppc(); 621 ATPPC_LOCK(atppc); 622 623 /* Record registers' status */ 624 atppc->sc_str_intr = atppc_r_str(atppc); 625 atppc->sc_ctr_intr = atppc_r_ctr(atppc); 626 atppc->sc_ecr_intr = atppc_r_ecr(atppc); 627 atppc_barrier_r(atppc); 628 629 /* Determine cause of interrupt and wake up top half */ 630 switch (atppc->sc_mode) { 631 case ATPPC_MODE_STD: 632 /* nAck pulsed for 5 usec, too fast to check reliably, assume */ 633 atppc->sc_irqstat = ATPPC_IRQ_nACK; 634 if (atppc->sc_outb) 635 wake_up = WRITER; 636 else 637 claim = 0; 638 break; 639 640 case ATPPC_MODE_NIBBLE: 641 case ATPPC_MODE_PS2: 642 /* nAck is set low by device and then high on ack */ 643 if (!(atppc->sc_str_intr & nACK)) { 644 claim = 0; 645 break; 646 } 647 atppc->sc_irqstat = ATPPC_IRQ_nACK; 648 if (atppc->sc_inb) 649 wake_up = READER; 650 break; 651 652 case ATPPC_MODE_ECP: 653 case ATPPC_MODE_FAST: 654 /* Confirm interrupt cause: these are not pulsed as in nAck. */ 655 if (atppc->sc_ecr_intr & ATPPC_SERVICE_INTR) { 656 if (atppc->sc_ecr_intr & ATPPC_ENABLE_DMA) 657 atppc->sc_irqstat |= ATPPC_IRQ_DMA; 658 else 659 atppc->sc_irqstat |= ATPPC_IRQ_FIFO; 660 661 /* Decide where top half will be waiting */ 662 if (atppc->sc_mode & ATPPC_MODE_ECP) { 663 if (atppc->sc_ctr_intr & PCD) { 664 if (atppc->sc_inb) 665 wake_up = READER; 666 else 667 claim = 0; 668 } else { 669 if (atppc->sc_outb) 670 wake_up = WRITER; 671 else 672 claim = 0; 673 } 674 } else { 675 if (atppc->sc_outb) 676 wake_up = WRITER; 677 else 678 claim = 0; 679 } 680 } 681 /* Determine if nFault has occurred */ 682 if ((atppc->sc_mode & ATPPC_MODE_ECP) && 683 (atppc->sc_ecr_intr & ATPPC_nFAULT_INTR) && 684 !(atppc->sc_str_intr & nFAULT)) { 685 686 /* Device is requesting the channel */ 687 atppc->sc_irqstat |= ATPPC_IRQ_nFAULT; 688 claim = 1; 689 } 690 break; 691 692 case ATPPC_MODE_EPP: 693 /* nAck pulsed for 5 usec, too fast to check reliably */ 694 atppc->sc_irqstat = ATPPC_IRQ_nACK; 695 if (atppc->sc_inb) 696 wake_up = WRITER; 697 else if (atppc->sc_outb) 698 wake_up = READER; 699 else 700 claim = 0; 701 break; 702 703 default: 704 panic("%s: chipset is in invalid mode.", dev->dv_xname); 705 } 706 707 if (claim) { 708 switch (wake_up) { 709 case NONE: 710 break; 711 712 case READER: 713 wakeup(atppc->sc_inb); 714 break; 715 716 case WRITER: 717 wakeup(atppc->sc_outb); 718 break; 719 } 720 } 721 722 ATPPC_UNLOCK(atppc); 723 724 /* Call all of the installed handlers */ 725 if (claim) { 726 struct atppc_handler_node * callback; 727 SLIST_FOREACH(callback, &(atppc->sc_handler_listhead), 728 entries) { 729 (*callback->func)(callback->arg); 730 } 731 } 732 733 splx(s); 734 735 return claim; 736 } 737 738 739 /* Functions which support ppbus interface */ 740 741 742 /* Check EPP mode timeout */ 743 static int 744 atppc_check_epp_timeout(struct device *dev) 745 { 746 struct atppc_softc *atppc = (struct atppc_softc *)dev; 747 int s; 748 int error; 749 750 s = splatppc(); 751 ATPPC_LOCK(atppc); 752 753 atppc_reset_epp_timeout(dev); 754 error = !(atppc_r_str(atppc) & TIMEOUT); 755 atppc_barrier_r(atppc); 756 757 ATPPC_UNLOCK(atppc); 758 splx(s); 759 760 return (error); 761 } 762 763 /* 764 * EPP timeout, according to the PC87332 manual 765 * Semantics of clearing EPP timeout bit. 766 * PC87332 - reading SPP_STR does it... 767 * SMC - write 1 to EPP timeout bit XXX 768 * Others - (?) write 0 to EPP timeout bit 769 */ 770 static void 771 atppc_reset_epp_timeout(struct device *dev) 772 { 773 struct atppc_softc *atppc = (struct atppc_softc *)dev; 774 register unsigned char r; 775 776 r = atppc_r_str(atppc); 777 atppc_barrier_r(atppc); 778 atppc_w_str(atppc, r | 0x1); 779 atppc_barrier_w(atppc); 780 atppc_w_str(atppc, r & 0xfe); 781 atppc_barrier_w(atppc); 782 783 return; 784 } 785 786 787 /* Read from atppc device: returns 0 on success. */ 788 static int 789 atppc_read(struct device *dev, char *buf, int len, int ioflag, 790 size_t *cnt) 791 { 792 struct atppc_softc *atppc = (struct atppc_softc *)dev; 793 int error = 0; 794 int s; 795 796 s = splatppc(); 797 ATPPC_LOCK(atppc); 798 799 *cnt = 0; 800 801 /* Initialize buffer */ 802 atppc->sc_inb = atppc->sc_inbstart = buf; 803 atppc->sc_inb_nbytes = len; 804 805 /* Initialize device input error state for new operation */ 806 atppc->sc_inerr = 0; 807 808 /* Call appropriate function to read bytes */ 809 switch(atppc->sc_mode) { 810 case ATPPC_MODE_STD: 811 case ATPPC_MODE_FAST: 812 error = ENODEV; 813 break; 814 815 case ATPPC_MODE_NIBBLE: 816 atppc_nibble_read(atppc); 817 break; 818 819 case ATPPC_MODE_PS2: 820 atppc_byte_read(atppc); 821 break; 822 823 case ATPPC_MODE_ECP: 824 atppc_ecp_read(atppc); 825 break; 826 827 case ATPPC_MODE_EPP: 828 atppc_epp_read(atppc); 829 break; 830 831 default: 832 panic("%s(%s): chipset in invalid mode.\n", __func__, 833 dev->dv_xname); 834 } 835 836 /* Update counter*/ 837 *cnt = (atppc->sc_inbstart - atppc->sc_inb); 838 839 /* Reset buffer */ 840 atppc->sc_inb = atppc->sc_inbstart = NULL; 841 atppc->sc_inb_nbytes = 0; 842 843 if (!(error)) 844 error = atppc->sc_inerr; 845 846 ATPPC_UNLOCK(atppc); 847 splx(s); 848 849 return (error); 850 } 851 852 /* Write to atppc device: returns 0 on success. */ 853 static int 854 atppc_write(struct device *dev, char *buf, int len, int ioflag, size_t *cnt) 855 { 856 struct atppc_softc * const atppc = (struct atppc_softc *)dev; 857 int error = 0; 858 int s; 859 860 *cnt = 0; 861 862 s = splatppc(); 863 ATPPC_LOCK(atppc); 864 865 /* Set up line buffer */ 866 atppc->sc_outb = atppc->sc_outbstart = buf; 867 atppc->sc_outb_nbytes = len; 868 869 /* Initialize device output error state for new operation */ 870 atppc->sc_outerr = 0; 871 872 /* Call appropriate function to write bytes */ 873 switch (atppc->sc_mode) { 874 case ATPPC_MODE_STD: 875 atppc_std_write(atppc); 876 break; 877 878 case ATPPC_MODE_NIBBLE: 879 case ATPPC_MODE_PS2: 880 error = ENODEV; 881 break; 882 883 case ATPPC_MODE_FAST: 884 case ATPPC_MODE_ECP: 885 atppc_fifo_write(atppc); 886 break; 887 888 case ATPPC_MODE_EPP: 889 atppc_epp_write(atppc); 890 break; 891 892 default: 893 panic("%s(%s): chipset in invalid mode.\n", __func__, 894 dev->dv_xname); 895 } 896 897 /* Update counter*/ 898 *cnt = (atppc->sc_outbstart - atppc->sc_outb); 899 900 /* Reset output buffer */ 901 atppc->sc_outb = atppc->sc_outbstart = NULL; 902 atppc->sc_outb_nbytes = 0; 903 904 if (!(error)) 905 error = atppc->sc_outerr; 906 907 ATPPC_UNLOCK(atppc); 908 splx(s); 909 910 return (error); 911 } 912 913 /* 914 * Set mode of chipset to mode argument. Modes not supported are ignored. If 915 * multiple modes are flagged, the mode is not changed. Mode's are those 916 * defined for ppbus_softc.sc_mode in ppbus_conf.h. Only ECP-capable chipsets 917 * can change their mode of operation. However, ALL operation modes support 918 * centronics mode and nibble mode. Modes determine both hardware AND software 919 * behaviour. 920 * NOTE: the mode for ECP should only be changed when the channel is in 921 * forward idle mode. This function does not make sure FIFO's have flushed or 922 * any consistency checks. 923 */ 924 static int 925 atppc_setmode(struct device *dev, int mode) 926 { 927 struct atppc_softc *atppc = (struct atppc_softc *)dev; 928 u_int8_t ecr; 929 u_int8_t chipset_mode; 930 int s; 931 int rval = 0; 932 933 s = splatppc(); 934 ATPPC_LOCK(atppc); 935 936 /* If ECP capable, configure ecr register */ 937 if (atppc->sc_has & ATPPC_HAS_ECP) { 938 /* Read ECR with mode masked out */ 939 ecr = (atppc_r_ecr(atppc) & 0x1f); 940 atppc_barrier_r(atppc); 941 942 switch (mode) { 943 case PPBUS_ECP: 944 /* Set ECP mode */ 945 ecr |= ATPPC_ECR_ECP; 946 chipset_mode = ATPPC_MODE_ECP; 947 break; 948 949 case PPBUS_EPP: 950 /* Set EPP mode */ 951 if (atppc->sc_has & ATPPC_HAS_EPP) { 952 ecr |= ATPPC_ECR_EPP; 953 chipset_mode = ATPPC_MODE_EPP; 954 } else { 955 rval = ENODEV; 956 goto end; 957 } 958 break; 959 960 case PPBUS_FAST: 961 /* Set fast centronics mode */ 962 ecr |= ATPPC_ECR_FIFO; 963 chipset_mode = ATPPC_MODE_FAST; 964 break; 965 966 case PPBUS_PS2: 967 /* Set PS2 mode */ 968 ecr |= ATPPC_ECR_PS2; 969 chipset_mode = ATPPC_MODE_PS2; 970 break; 971 972 case PPBUS_COMPATIBLE: 973 /* Set standard mode */ 974 ecr |= ATPPC_ECR_STD; 975 chipset_mode = ATPPC_MODE_STD; 976 break; 977 978 case PPBUS_NIBBLE: 979 /* Set nibble mode: uses chipset standard mode */ 980 ecr |= ATPPC_ECR_STD; 981 chipset_mode = ATPPC_MODE_NIBBLE; 982 break; 983 984 default: 985 /* Invalid mode specified for ECP chip */ 986 ATPPC_DPRINTF(("%s(%s): invalid mode passed as " 987 "argument.\n", __func__, dev->dv_xname)); 988 rval = ENODEV; 989 goto end; 990 } 991 992 /* Switch to byte mode to be able to change modes. */ 993 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 994 atppc_barrier_w(atppc); 995 996 /* Update mode */ 997 atppc_w_ecr(atppc, ecr); 998 atppc_barrier_w(atppc); 999 } else { 1000 switch (mode) { 1001 case PPBUS_EPP: 1002 if (atppc->sc_has & ATPPC_HAS_EPP) { 1003 chipset_mode = ATPPC_MODE_EPP; 1004 } else { 1005 rval = ENODEV; 1006 goto end; 1007 } 1008 break; 1009 1010 case PPBUS_PS2: 1011 if (atppc->sc_has & ATPPC_HAS_PS2) { 1012 chipset_mode = ATPPC_MODE_PS2; 1013 } else { 1014 rval = ENODEV; 1015 goto end; 1016 } 1017 break; 1018 1019 case PPBUS_NIBBLE: 1020 /* Set nibble mode (virtual) */ 1021 chipset_mode = ATPPC_MODE_NIBBLE; 1022 break; 1023 1024 case PPBUS_COMPATIBLE: 1025 chipset_mode = ATPPC_MODE_STD; 1026 break; 1027 1028 case PPBUS_ECP: 1029 rval = ENODEV; 1030 goto end; 1031 1032 default: 1033 ATPPC_DPRINTF(("%s(%s): invalid mode passed as " 1034 "argument.\n", __func__, dev->dv_xname)); 1035 rval = ENODEV; 1036 goto end; 1037 } 1038 } 1039 1040 atppc->sc_mode = chipset_mode; 1041 if (chipset_mode == ATPPC_MODE_PS2) { 1042 /* Set direction bit to reverse */ 1043 ecr = atppc_r_ctr(atppc); 1044 atppc_barrier_r(atppc); 1045 ecr |= PCD; 1046 atppc_w_ctr(atppc, ecr); 1047 atppc_barrier_w(atppc); 1048 } 1049 1050 end: 1051 ATPPC_UNLOCK(atppc); 1052 splx(s); 1053 1054 return rval; 1055 } 1056 1057 /* Get the current mode of chipset */ 1058 static int 1059 atppc_getmode(struct device *dev) 1060 { 1061 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1062 int mode; 1063 int s; 1064 1065 s = splatppc(); 1066 ATPPC_LOCK(atppc); 1067 1068 /* The chipset can only be in one mode at a time logically */ 1069 switch (atppc->sc_mode) { 1070 case ATPPC_MODE_ECP: 1071 mode = PPBUS_ECP; 1072 break; 1073 1074 case ATPPC_MODE_EPP: 1075 mode = PPBUS_EPP; 1076 break; 1077 1078 case ATPPC_MODE_PS2: 1079 mode = PPBUS_PS2; 1080 break; 1081 1082 case ATPPC_MODE_STD: 1083 mode = PPBUS_COMPATIBLE; 1084 break; 1085 1086 case ATPPC_MODE_NIBBLE: 1087 mode = PPBUS_NIBBLE; 1088 break; 1089 1090 case ATPPC_MODE_FAST: 1091 mode = PPBUS_FAST; 1092 break; 1093 1094 default: 1095 panic("%s(%s): device is in invalid mode!", __func__, 1096 dev->dv_xname); 1097 break; 1098 } 1099 1100 ATPPC_UNLOCK(atppc); 1101 splx(s); 1102 1103 return mode; 1104 } 1105 1106 1107 /* Wait for FIFO buffer to empty for ECP-capable chipset */ 1108 static void 1109 atppc_ecp_sync(struct device *dev) 1110 { 1111 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1112 int i; 1113 int s; 1114 u_int8_t r; 1115 1116 s = splatppc(); 1117 ATPPC_LOCK(atppc); 1118 1119 /* 1120 * Only wait for FIFO to empty if mode is chipset is ECP-capable AND 1121 * the mode is either ECP or Fast Centronics. 1122 */ 1123 r = atppc_r_ecr(atppc); 1124 atppc_barrier_r(atppc); 1125 r &= 0xe0; 1126 if (!(atppc->sc_has & ATPPC_HAS_ECP) || ((r != ATPPC_ECR_ECP) 1127 && (r != ATPPC_ECR_FIFO))) { 1128 goto end; 1129 } 1130 1131 /* Wait for FIFO to empty */ 1132 for (i = 0; i < ((MAXBUSYWAIT/hz) * 1000000); i += 100) { 1133 r = atppc_r_ecr(atppc); 1134 atppc_barrier_r(atppc); 1135 if (r & ATPPC_FIFO_EMPTY) { 1136 goto end; 1137 } 1138 delay(100); /* Supposed to be a 100 usec delay */ 1139 } 1140 1141 ATPPC_DPRINTF(("%s: ECP sync failed, data still in FIFO.\n", 1142 dev->dv_xname)); 1143 1144 end: 1145 ATPPC_UNLOCK(atppc); 1146 splx(s); 1147 1148 return; 1149 } 1150 1151 /* Execute a microsequence to handle fast I/O operations. */ 1152 static int 1153 atppc_exec_microseq(struct device *dev, struct ppbus_microseq **p_msq) 1154 { 1155 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1156 struct ppbus_microseq *mi = *p_msq; 1157 char cc, *p; 1158 int i, iter, len; 1159 int error; 1160 int s; 1161 register int reg; 1162 register unsigned char mask; 1163 register int accum = 0; 1164 register char *ptr = NULL; 1165 struct ppbus_microseq *stack = NULL; 1166 1167 s = splatppc(); 1168 ATPPC_LOCK(atppc); 1169 1170 /* microsequence registers are equivalent to PC-like port registers */ 1171 1172 #define r_reg(register,atppc) bus_space_read_1((atppc)->sc_iot, \ 1173 (atppc)->sc_ioh, (register)) 1174 #define w_reg(register, atppc, byte) bus_space_write_1((atppc)->sc_iot, \ 1175 (atppc)->sc_ioh, (register), (byte)) 1176 1177 /* Loop until microsequence execution finishes (ending op code) */ 1178 for (;;) { 1179 switch (mi->opcode) { 1180 case MS_OP_RSET: 1181 cc = r_reg(mi->arg[0].i, atppc); 1182 atppc_barrier_r(atppc); 1183 cc &= (char)mi->arg[2].i; /* clear mask */ 1184 cc |= (char)mi->arg[1].i; /* assert mask */ 1185 w_reg(mi->arg[0].i, atppc, cc); 1186 atppc_barrier_w(atppc); 1187 mi++; 1188 break; 1189 1190 case MS_OP_RASSERT_P: 1191 reg = mi->arg[1].i; 1192 ptr = atppc->sc_ptr; 1193 1194 if ((len = mi->arg[0].i) == MS_ACCUM) { 1195 accum = atppc->sc_accum; 1196 for (; accum; accum--) { 1197 w_reg(reg, atppc, *ptr++); 1198 atppc_barrier_w(atppc); 1199 } 1200 atppc->sc_accum = accum; 1201 } else { 1202 for (i = 0; i < len; i++) { 1203 w_reg(reg, atppc, *ptr++); 1204 atppc_barrier_w(atppc); 1205 } 1206 } 1207 1208 atppc->sc_ptr = ptr; 1209 mi++; 1210 break; 1211 1212 case MS_OP_RFETCH_P: 1213 reg = mi->arg[1].i; 1214 mask = (char)mi->arg[2].i; 1215 ptr = atppc->sc_ptr; 1216 1217 if ((len = mi->arg[0].i) == MS_ACCUM) { 1218 accum = atppc->sc_accum; 1219 for (; accum; accum--) { 1220 *ptr++ = r_reg(reg, atppc) & mask; 1221 atppc_barrier_r(atppc); 1222 } 1223 atppc->sc_accum = accum; 1224 } else { 1225 for (i = 0; i < len; i++) { 1226 *ptr++ = r_reg(reg, atppc) & mask; 1227 atppc_barrier_r(atppc); 1228 } 1229 } 1230 1231 atppc->sc_ptr = ptr; 1232 mi++; 1233 break; 1234 1235 case MS_OP_RFETCH: 1236 *((char *)mi->arg[2].p) = r_reg(mi->arg[0].i, atppc) & 1237 (char)mi->arg[1].i; 1238 atppc_barrier_r(atppc); 1239 mi++; 1240 break; 1241 1242 case MS_OP_RASSERT: 1243 case MS_OP_DELAY: 1244 /* let's suppose the next instr. is the same */ 1245 do { 1246 for (;mi->opcode == MS_OP_RASSERT; mi++) { 1247 w_reg(mi->arg[0].i, atppc, 1248 (char)mi->arg[1].i); 1249 atppc_barrier_w(atppc); 1250 } 1251 1252 for (;mi->opcode == MS_OP_DELAY; mi++) { 1253 delay(mi->arg[0].i); 1254 } 1255 } while (mi->opcode == MS_OP_RASSERT); 1256 break; 1257 1258 case MS_OP_ADELAY: 1259 if (mi->arg[0].i) { 1260 tsleep(atppc, PPBUSPRI, "atppcdelay", 1261 mi->arg[0].i * (hz/1000)); 1262 } 1263 mi++; 1264 break; 1265 1266 case MS_OP_TRIG: 1267 reg = mi->arg[0].i; 1268 iter = mi->arg[1].i; 1269 p = (char *)mi->arg[2].p; 1270 1271 /* XXX delay limited to 255 us */ 1272 for (i = 0; i < iter; i++) { 1273 w_reg(reg, atppc, *p++); 1274 atppc_barrier_w(atppc); 1275 delay((unsigned char)*p++); 1276 } 1277 1278 mi++; 1279 break; 1280 1281 case MS_OP_SET: 1282 atppc->sc_accum = mi->arg[0].i; 1283 mi++; 1284 break; 1285 1286 case MS_OP_DBRA: 1287 if (--atppc->sc_accum > 0) { 1288 mi += mi->arg[0].i; 1289 } 1290 1291 mi++; 1292 break; 1293 1294 case MS_OP_BRSET: 1295 cc = atppc_r_str(atppc); 1296 atppc_barrier_r(atppc); 1297 if ((cc & (char)mi->arg[0].i) == (char)mi->arg[0].i) { 1298 mi += mi->arg[1].i; 1299 } 1300 mi++; 1301 break; 1302 1303 case MS_OP_BRCLEAR: 1304 cc = atppc_r_str(atppc); 1305 atppc_barrier_r(atppc); 1306 if ((cc & (char)mi->arg[0].i) == 0) { 1307 mi += mi->arg[1].i; 1308 } 1309 mi++; 1310 break; 1311 1312 case MS_OP_BRSTAT: 1313 cc = atppc_r_str(atppc); 1314 atppc_barrier_r(atppc); 1315 if ((cc & ((char)mi->arg[0].i | (char)mi->arg[1].i)) == 1316 (char)mi->arg[0].i) { 1317 mi += mi->arg[2].i; 1318 } 1319 mi++; 1320 break; 1321 1322 case MS_OP_C_CALL: 1323 /* 1324 * If the C call returns !0 then end the microseq. 1325 * The current state of ptr is passed to the C function 1326 */ 1327 if ((error = mi->arg[0].f(mi->arg[1].p, 1328 atppc->sc_ptr))) { 1329 ATPPC_UNLOCK(atppc); 1330 splx(s); 1331 return (error); 1332 } 1333 mi++; 1334 break; 1335 1336 case MS_OP_PTR: 1337 atppc->sc_ptr = (char *)mi->arg[0].p; 1338 mi++; 1339 break; 1340 1341 case MS_OP_CALL: 1342 if (stack) { 1343 panic("%s - %s: too much calls", dev->dv_xname, 1344 __func__); 1345 } 1346 1347 if (mi->arg[0].p) { 1348 /* store state of the actual microsequence */ 1349 stack = mi; 1350 1351 /* jump to the new microsequence */ 1352 mi = (struct ppbus_microseq *)mi->arg[0].p; 1353 } else { 1354 mi++; 1355 } 1356 break; 1357 1358 case MS_OP_SUBRET: 1359 /* retrieve microseq and pc state before the call */ 1360 mi = stack; 1361 1362 /* reset the stack */ 1363 stack = 0; 1364 1365 /* XXX return code */ 1366 1367 mi++; 1368 break; 1369 1370 case MS_OP_PUT: 1371 case MS_OP_GET: 1372 case MS_OP_RET: 1373 /* 1374 * Can't return to atppc level during the execution 1375 * of a submicrosequence. 1376 */ 1377 if (stack) { 1378 panic("%s: cannot return to atppc level", 1379 __func__); 1380 } 1381 /* update pc for atppc level of execution */ 1382 *p_msq = mi; 1383 1384 ATPPC_UNLOCK(atppc); 1385 splx(s); 1386 return (0); 1387 break; 1388 1389 default: 1390 panic("%s: unknown microsequence " 1391 "opcode 0x%x", __func__, mi->opcode); 1392 break; 1393 } 1394 } 1395 1396 /* Should not be reached! */ 1397 #ifdef ATPPC_DEBUG 1398 panic("%s: unexpected code reached!\n", __func__); 1399 #endif 1400 } 1401 1402 /* General I/O routine */ 1403 static u_int8_t 1404 atppc_io(struct device *dev, int iop, u_char *addr, int cnt, u_char byte) 1405 { 1406 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1407 u_int8_t val = 0; 1408 int s; 1409 1410 s = splatppc(); 1411 ATPPC_LOCK(atppc); 1412 1413 switch (iop) { 1414 case PPBUS_OUTSB_EPP: 1415 bus_space_write_multi_1(atppc->sc_iot, atppc->sc_ioh, 1416 ATPPC_EPP_DATA, addr, cnt); 1417 break; 1418 case PPBUS_OUTSW_EPP: 1419 bus_space_write_multi_2(atppc->sc_iot, atppc->sc_ioh, 1420 ATPPC_EPP_DATA, (u_int16_t *)addr, cnt); 1421 break; 1422 case PPBUS_OUTSL_EPP: 1423 bus_space_write_multi_4(atppc->sc_iot, atppc->sc_ioh, 1424 ATPPC_EPP_DATA, (u_int32_t *)addr, cnt); 1425 break; 1426 case PPBUS_INSB_EPP: 1427 bus_space_read_multi_1(atppc->sc_iot, atppc->sc_ioh, 1428 ATPPC_EPP_DATA, addr, cnt); 1429 break; 1430 case PPBUS_INSW_EPP: 1431 bus_space_read_multi_2(atppc->sc_iot, atppc->sc_ioh, 1432 ATPPC_EPP_DATA, (u_int16_t *)addr, cnt); 1433 break; 1434 case PPBUS_INSL_EPP: 1435 bus_space_read_multi_4(atppc->sc_iot, atppc->sc_ioh, 1436 ATPPC_EPP_DATA, (u_int32_t *)addr, cnt); 1437 break; 1438 case PPBUS_RDTR: 1439 val = (atppc_r_dtr(atppc)); 1440 break; 1441 case PPBUS_RSTR: 1442 val = (atppc_r_str(atppc)); 1443 break; 1444 case PPBUS_RCTR: 1445 val = (atppc_r_ctr(atppc)); 1446 break; 1447 case PPBUS_REPP_A: 1448 val = (atppc_r_eppA(atppc)); 1449 break; 1450 case PPBUS_REPP_D: 1451 val = (atppc_r_eppD(atppc)); 1452 break; 1453 case PPBUS_RECR: 1454 val = (atppc_r_ecr(atppc)); 1455 break; 1456 case PPBUS_RFIFO: 1457 val = (atppc_r_fifo(atppc)); 1458 break; 1459 case PPBUS_WDTR: 1460 atppc_w_dtr(atppc, byte); 1461 break; 1462 case PPBUS_WSTR: 1463 atppc_w_str(atppc, byte); 1464 break; 1465 case PPBUS_WCTR: 1466 atppc_w_ctr(atppc, byte); 1467 break; 1468 case PPBUS_WEPP_A: 1469 atppc_w_eppA(atppc, byte); 1470 break; 1471 case PPBUS_WEPP_D: 1472 atppc_w_eppD(atppc, byte); 1473 break; 1474 case PPBUS_WECR: 1475 atppc_w_ecr(atppc, byte); 1476 break; 1477 case PPBUS_WFIFO: 1478 atppc_w_fifo(atppc, byte); 1479 break; 1480 default: 1481 panic("%s(%s): unknown I/O operation", dev->dv_xname, 1482 __func__); 1483 break; 1484 } 1485 1486 atppc_barrier(atppc); 1487 1488 ATPPC_UNLOCK(atppc); 1489 splx(s); 1490 1491 return val; 1492 } 1493 1494 /* Read "instance variables" of atppc device */ 1495 static int 1496 atppc_read_ivar(struct device *dev, int index, unsigned int *val) 1497 { 1498 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1499 int rval = 0; 1500 int s; 1501 1502 s = splatppc(); 1503 ATPPC_LOCK(atppc); 1504 1505 switch(index) { 1506 case PPBUS_IVAR_EPP_PROTO: 1507 if (atppc->sc_epp == ATPPC_EPP_1_9) 1508 *val = PPBUS_EPP_1_9; 1509 else if (atppc->sc_epp == ATPPC_EPP_1_7) 1510 *val = PPBUS_EPP_1_7; 1511 /* XXX what if not using EPP ? */ 1512 break; 1513 1514 case PPBUS_IVAR_INTR: 1515 *val = ((atppc->sc_use & ATPPC_USE_INTR) != 0); 1516 break; 1517 1518 case PPBUS_IVAR_DMA: 1519 *val = ((atppc->sc_use & ATPPC_USE_DMA) != 0); 1520 break; 1521 1522 default: 1523 rval = ENODEV; 1524 } 1525 1526 ATPPC_UNLOCK(atppc); 1527 splx(s); 1528 1529 return rval; 1530 } 1531 1532 /* Write "instance varaibles" of atppc device */ 1533 static int 1534 atppc_write_ivar(struct device *dev, int index, unsigned int *val) 1535 { 1536 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1537 int rval = 0; 1538 int s; 1539 1540 s = splatppc(); 1541 ATPPC_LOCK(atppc); 1542 1543 switch(index) { 1544 case PPBUS_IVAR_EPP_PROTO: 1545 if (*val == PPBUS_EPP_1_9 || *val == PPBUS_EPP_1_7) 1546 atppc->sc_epp = *val; 1547 else 1548 rval = EINVAL; 1549 break; 1550 1551 case PPBUS_IVAR_INTR: 1552 if (*val == 0) 1553 atppc->sc_use &= ~ATPPC_USE_INTR; 1554 else if (atppc->sc_has & ATPPC_HAS_INTR) 1555 atppc->sc_use |= ATPPC_USE_INTR; 1556 else 1557 rval = ENODEV; 1558 break; 1559 1560 case PPBUS_IVAR_DMA: 1561 if (*val == 0) 1562 atppc->sc_use &= ~ATPPC_USE_DMA; 1563 else if (atppc->sc_has & ATPPC_HAS_DMA) 1564 atppc->sc_use |= ATPPC_USE_DMA; 1565 else 1566 rval = ENODEV; 1567 break; 1568 1569 default: 1570 rval = ENODEV; 1571 } 1572 1573 ATPPC_UNLOCK(atppc); 1574 splx(s); 1575 1576 return rval; 1577 } 1578 1579 /* Add a handler routine to be called by the interrupt handler */ 1580 static int 1581 atppc_add_handler(struct device *dev, void (*handler)(void *), void *arg) 1582 { 1583 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1584 struct atppc_handler_node *callback; 1585 int rval = 0; 1586 int s; 1587 1588 s = splatppc(); 1589 ATPPC_LOCK(atppc); 1590 1591 if (handler == NULL) { 1592 ATPPC_DPRINTF(("%s(%s): attempt to register NULL handler.\n", 1593 __func__, dev->dv_xname)); 1594 rval = EINVAL; 1595 } else { 1596 callback = malloc(sizeof(struct atppc_handler_node), M_DEVBUF, 1597 M_NOWAIT); 1598 if (callback) { 1599 callback->func = handler; 1600 callback->arg = arg; 1601 SLIST_INSERT_HEAD(&(atppc->sc_handler_listhead), 1602 callback, entries); 1603 } else { 1604 rval = ENOMEM; 1605 } 1606 } 1607 1608 ATPPC_UNLOCK(atppc); 1609 splx(s); 1610 1611 return rval; 1612 } 1613 1614 /* Remove a handler added by atppc_add_handler() */ 1615 static int 1616 atppc_remove_handler(struct device *dev, void (*handler)(void *)) 1617 { 1618 struct atppc_softc *atppc = (struct atppc_softc *)dev; 1619 struct atppc_handler_node *callback; 1620 int rval = EINVAL; 1621 int s; 1622 1623 s = splatppc(); 1624 ATPPC_LOCK(atppc); 1625 1626 if (SLIST_EMPTY(&(atppc->sc_handler_listhead))) 1627 panic("%s(%s): attempt to remove handler from empty list.\n", 1628 __func__, dev->dv_xname); 1629 1630 /* Search list for handler */ 1631 SLIST_FOREACH(callback, &(atppc->sc_handler_listhead), entries) { 1632 if (callback->func == handler) { 1633 SLIST_REMOVE(&(atppc->sc_handler_listhead), callback, 1634 atppc_handler_node, entries); 1635 free(callback, M_DEVBUF); 1636 rval = 0; 1637 break; 1638 } 1639 } 1640 1641 ATPPC_UNLOCK(atppc); 1642 splx(s); 1643 1644 return rval; 1645 } 1646 1647 /* Utility functions */ 1648 1649 1650 /* 1651 * Functions that read bytes from port into buffer: called from interrupt 1652 * handler depending on current chipset mode and cause of interrupt. Return 1653 * value: number of bytes moved. 1654 */ 1655 1656 /* Only the lower 4 bits of the final value are valid */ 1657 #define nibble2char(s) ((((s) & ~nACK) >> 3) | (~(s) & nBUSY) >> 4) 1658 1659 /* Read bytes in nibble mode */ 1660 static void 1661 atppc_nibble_read(struct atppc_softc *atppc) 1662 { 1663 int i; 1664 u_int8_t nibble[2]; 1665 u_int8_t ctr; 1666 u_int8_t str; 1667 1668 /* Enable interrupts if needed */ 1669 if (atppc->sc_use & ATPPC_USE_INTR) { 1670 ctr = atppc_r_ctr(atppc); 1671 atppc_barrier_r(atppc); 1672 if (!(ctr & IRQENABLE)) { 1673 ctr |= IRQENABLE; 1674 atppc_w_ctr(atppc, ctr); 1675 atppc_barrier_w(atppc); 1676 } 1677 } 1678 1679 while (atppc->sc_inbstart < (atppc->sc_inb + atppc->sc_inb_nbytes)) { 1680 /* Check if device has data to send in idle phase */ 1681 str = atppc_r_str(atppc); 1682 atppc_barrier_r(atppc); 1683 if (str & nDATAVAIL) { 1684 return; 1685 } 1686 1687 /* Nibble-mode handshake transfer */ 1688 for (i = 0; i < 2; i++) { 1689 /* Event 7 - ready to take data (HOSTBUSY low) */ 1690 ctr = atppc_r_ctr(atppc); 1691 atppc_barrier_r(atppc); 1692 ctr |= HOSTBUSY; 1693 atppc_w_ctr(atppc, ctr); 1694 atppc_barrier_w(atppc); 1695 1696 /* Event 8 - peripheral writes the first nibble */ 1697 1698 /* Event 9 - peripheral set nAck low */ 1699 atppc->sc_inerr = atppc_poll_str(atppc, 0, PTRCLK); 1700 if (atppc->sc_inerr) 1701 return; 1702 1703 /* read nibble */ 1704 nibble[i] = atppc_r_str(atppc); 1705 1706 /* Event 10 - ack, nibble received */ 1707 ctr &= ~HOSTBUSY; 1708 atppc_w_ctr(atppc, ctr); 1709 1710 /* Event 11 - wait ack from peripherial */ 1711 if (atppc->sc_use & ATPPC_USE_INTR) 1712 atppc->sc_inerr = atppc_wait_interrupt(atppc, 1713 atppc->sc_inb, ATPPC_IRQ_nACK); 1714 else 1715 atppc->sc_inerr = atppc_poll_str(atppc, PTRCLK, 1716 PTRCLK); 1717 if (atppc->sc_inerr) 1718 return; 1719 } 1720 1721 /* Store byte transfered */ 1722 *(atppc->sc_inbstart) = ((nibble2char(nibble[1]) << 4) & 0xf0) | 1723 (nibble2char(nibble[0]) & 0x0f); 1724 atppc->sc_inbstart++; 1725 } 1726 } 1727 1728 /* Read bytes in bidirectional mode */ 1729 static void 1730 atppc_byte_read(struct atppc_softc * const atppc) 1731 { 1732 u_int8_t ctr; 1733 u_int8_t str; 1734 1735 /* Check direction bit */ 1736 ctr = atppc_r_ctr(atppc); 1737 atppc_barrier_r(atppc); 1738 if (!(ctr & PCD)) { 1739 ATPPC_DPRINTF(("%s: byte-mode read attempted without direction " 1740 "bit set.", atppc->sc_dev.dv_xname)); 1741 atppc->sc_inerr = ENODEV; 1742 return; 1743 } 1744 /* Enable interrupts if needed */ 1745 if (atppc->sc_use & ATPPC_USE_INTR) { 1746 if (!(ctr & IRQENABLE)) { 1747 ctr |= IRQENABLE; 1748 atppc_w_ctr(atppc, ctr); 1749 atppc_barrier_w(atppc); 1750 } 1751 } 1752 1753 /* Byte-mode handshake transfer */ 1754 while (atppc->sc_inbstart < (atppc->sc_inb + atppc->sc_inb_nbytes)) { 1755 /* Check if device has data to send */ 1756 str = atppc_r_str(atppc); 1757 atppc_barrier_r(atppc); 1758 if (str & nDATAVAIL) { 1759 return; 1760 } 1761 1762 /* Event 7 - ready to take data (nAUTO low) */ 1763 ctr |= HOSTBUSY; 1764 atppc_w_ctr(atppc, ctr); 1765 atppc_barrier_w(atppc); 1766 1767 /* Event 9 - peripheral set nAck low */ 1768 atppc->sc_inerr = atppc_poll_str(atppc, 0, PTRCLK); 1769 if (atppc->sc_inerr) 1770 return; 1771 1772 /* Store byte transfered */ 1773 *(atppc->sc_inbstart) = atppc_r_dtr(atppc); 1774 atppc_barrier_r(atppc); 1775 1776 /* Event 10 - data received, can't accept more */ 1777 ctr &= ~HOSTBUSY; 1778 atppc_w_ctr(atppc, ctr); 1779 atppc_barrier_w(atppc); 1780 1781 /* Event 11 - peripheral ack */ 1782 if (atppc->sc_use & ATPPC_USE_INTR) 1783 atppc->sc_inerr = atppc_wait_interrupt(atppc, 1784 atppc->sc_inb, ATPPC_IRQ_nACK); 1785 else 1786 atppc->sc_inerr = atppc_poll_str(atppc, PTRCLK, PTRCLK); 1787 if (atppc->sc_inerr) 1788 return; 1789 1790 /* Event 16 - strobe */ 1791 str |= HOSTCLK; 1792 atppc_w_str(atppc, str); 1793 atppc_barrier_w(atppc); 1794 DELAY(1); 1795 str &= ~HOSTCLK; 1796 atppc_w_str(atppc, str); 1797 atppc_barrier_w(atppc); 1798 1799 /* Update counter */ 1800 atppc->sc_inbstart++; 1801 } 1802 } 1803 1804 /* Read bytes in EPP mode */ 1805 static void 1806 atppc_epp_read(struct atppc_softc * atppc) 1807 { 1808 if (atppc->sc_epp == ATPPC_EPP_1_9) { 1809 { 1810 uint8_t str; 1811 int i; 1812 1813 atppc_reset_epp_timeout((struct device *)atppc); 1814 for (i = 0; i < atppc->sc_inb_nbytes; i++) { 1815 *(atppc->sc_inbstart) = atppc_r_eppD(atppc); 1816 atppc_barrier_r(atppc); 1817 str = atppc_r_str(atppc); 1818 atppc_barrier_r(atppc); 1819 if (str & TIMEOUT) { 1820 atppc->sc_inerr = EIO; 1821 break; 1822 } 1823 atppc->sc_inbstart++; 1824 } 1825 } 1826 } else { 1827 /* Read data block from EPP data register */ 1828 atppc_r_eppD_multi(atppc, atppc->sc_inbstart, 1829 atppc->sc_inb_nbytes); 1830 atppc_barrier_r(atppc); 1831 /* Update buffer position, byte count and counter */ 1832 atppc->sc_inbstart += atppc->sc_inb_nbytes; 1833 } 1834 1835 return; 1836 } 1837 1838 /* Read bytes in ECP mode */ 1839 static void 1840 atppc_ecp_read(struct atppc_softc *atppc) 1841 { 1842 u_int8_t ecr; 1843 u_int8_t ctr; 1844 u_int8_t str; 1845 const unsigned char ctr_sav = atppc_r_ctr(atppc); 1846 const unsigned char ecr_sav = atppc_r_ecr(atppc); 1847 unsigned int worklen; 1848 1849 /* Check direction bit */ 1850 ctr = ctr_sav; 1851 atppc_barrier_r(atppc); 1852 if (!(ctr & PCD)) { 1853 ATPPC_DPRINTF(("%s: ecp-mode read attempted without direction " 1854 "bit set.", atppc->sc_dev.dv_xname)); 1855 atppc->sc_inerr = ENODEV; 1856 goto end; 1857 } 1858 1859 /* Clear device request if any */ 1860 if (atppc->sc_use & ATPPC_USE_INTR) 1861 atppc->sc_irqstat &= ~ATPPC_IRQ_nFAULT; 1862 1863 while (atppc->sc_inbstart < (atppc->sc_inb + atppc->sc_inb_nbytes)) { 1864 ecr = atppc_r_ecr(atppc); 1865 atppc_barrier_r(atppc); 1866 if (ecr & ATPPC_FIFO_EMPTY) { 1867 /* Check for invalid state */ 1868 if (ecr & ATPPC_FIFO_FULL) { 1869 atppc_ecp_read_error(atppc, worklen); 1870 break; 1871 } 1872 1873 /* Check if device has data to send */ 1874 str = atppc_r_str(atppc); 1875 atppc_barrier_r(atppc); 1876 if (str & nDATAVAIL) { 1877 break; 1878 } 1879 1880 if (atppc->sc_use & ATPPC_USE_INTR) { 1881 /* Enable interrupts */ 1882 ecr &= ~ATPPC_SERVICE_INTR; 1883 atppc_w_ecr(atppc, ecr); 1884 atppc_barrier_w(atppc); 1885 /* Wait for FIFO to fill */ 1886 atppc->sc_inerr = atppc_wait_interrupt(atppc, 1887 atppc->sc_inb, ATPPC_IRQ_FIFO); 1888 if (atppc->sc_inerr) 1889 break; 1890 } else { 1891 DELAY(1); 1892 } 1893 continue; 1894 } 1895 else if (ecr & ATPPC_FIFO_FULL) { 1896 /* Transfer sc_fifo bytes */ 1897 worklen = atppc->sc_fifo; 1898 } 1899 else if (ecr & ATPPC_SERVICE_INTR) { 1900 /* Transfer sc_rthr bytes */ 1901 worklen = atppc->sc_rthr; 1902 } else { 1903 /* At least one byte is in the FIFO */ 1904 worklen = 1; 1905 } 1906 1907 if ((atppc->sc_use & ATPPC_USE_INTR) && 1908 (atppc->sc_use & ATPPC_USE_DMA)) { 1909 1910 atppc_ecp_read_dma(atppc, &worklen, ecr); 1911 } else { 1912 atppc_ecp_read_pio(atppc, &worklen, ecr); 1913 } 1914 1915 if (atppc->sc_inerr) { 1916 atppc_ecp_read_error(atppc, worklen); 1917 break; 1918 } 1919 1920 /* Update counter */ 1921 atppc->sc_inbstart += worklen; 1922 } 1923 end: 1924 atppc_w_ctr(atppc, ctr_sav); 1925 atppc_w_ecr(atppc, ecr_sav); 1926 atppc_barrier_w(atppc); 1927 } 1928 1929 /* Read bytes in ECP mode using DMA transfers */ 1930 static void 1931 atppc_ecp_read_dma(struct atppc_softc *atppc, unsigned int *length, 1932 unsigned char ecr) 1933 { 1934 /* Limit transfer to maximum DMA size and start it */ 1935 *length = min(*length, atppc->sc_dma_maxsize); 1936 atppc->sc_dmastat = ATPPC_DMA_INIT; 1937 atppc->sc_dma_start(atppc, atppc->sc_inbstart, *length, 1938 ATPPC_DMA_MODE_READ); 1939 1940 atppc->sc_dmastat = ATPPC_DMA_STARTED; 1941 1942 /* Enable interrupts, DMA */ 1943 ecr &= ~ATPPC_SERVICE_INTR; 1944 ecr |= ATPPC_ENABLE_DMA; 1945 atppc_w_ecr(atppc, ecr); 1946 atppc_barrier_w(atppc); 1947 1948 /* Wait for DMA completion */ 1949 atppc->sc_inerr = atppc_wait_interrupt(atppc, atppc->sc_inb, 1950 ATPPC_IRQ_DMA); 1951 if (atppc->sc_inerr) 1952 return; 1953 1954 /* Get register value recorded by interrupt handler */ 1955 ecr = atppc->sc_ecr_intr; 1956 /* Clear DMA programming */ 1957 atppc->sc_dma_finish(atppc); 1958 atppc->sc_dmastat = ATPPC_DMA_COMPLETE; 1959 /* Disable DMA */ 1960 ecr &= ~ATPPC_ENABLE_DMA; 1961 atppc_w_ecr(atppc, ecr); 1962 atppc_barrier_w(atppc); 1963 } 1964 1965 /* Read bytes in ECP mode using PIO transfers */ 1966 static void 1967 atppc_ecp_read_pio(struct atppc_softc *atppc, unsigned int *length, 1968 unsigned char ecr) 1969 { 1970 /* Disable DMA */ 1971 ecr &= ~ATPPC_ENABLE_DMA; 1972 atppc_w_ecr(atppc, ecr); 1973 atppc_barrier_w(atppc); 1974 1975 /* Read from FIFO */ 1976 atppc_r_fifo_multi(atppc, atppc->sc_inbstart, *length); 1977 } 1978 1979 /* Handle errors for ECP reads */ 1980 static void 1981 atppc_ecp_read_error(struct atppc_softc *atppc, const unsigned int worklen) 1982 { 1983 unsigned char ecr = atppc_r_ecr(atppc); 1984 1985 /* Abort DMA if not finished */ 1986 if (atppc->sc_dmastat == ATPPC_DMA_STARTED) { 1987 atppc->sc_dma_abort(atppc); 1988 ATPPC_DPRINTF(("%s: DMA interrupted.\n", __func__)); 1989 } 1990 1991 /* Check for invalid states */ 1992 if ((ecr & ATPPC_FIFO_EMPTY) && (ecr & ATPPC_FIFO_FULL)) { 1993 ATPPC_DPRINTF(("%s: FIFO full+empty bits set.\n", __func__)); 1994 ATPPC_DPRINTF(("%s: reseting FIFO.\n", __func__)); 1995 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 1996 atppc_barrier_w(atppc); 1997 } 1998 } 1999 2000 /* 2001 * Functions that write bytes to port from buffer: called from atppc_write() 2002 * function depending on current chipset mode. Returns number of bytes moved. 2003 */ 2004 2005 /* Write bytes in std/bidirectional mode */ 2006 static void 2007 atppc_std_write(struct atppc_softc * const atppc) 2008 { 2009 unsigned int timecount; 2010 unsigned char ctr; 2011 2012 ctr = atppc_r_ctr(atppc); 2013 atppc_barrier_r(atppc); 2014 /* Enable interrupts if needed */ 2015 if (atppc->sc_use & ATPPC_USE_INTR) { 2016 if (!(ctr & IRQENABLE)) { 2017 ctr |= IRQENABLE; 2018 atppc_w_ctr(atppc, ctr); 2019 atppc_barrier_w(atppc); 2020 } 2021 } 2022 2023 while (atppc->sc_outbstart < (atppc->sc_outb + atppc->sc_outb_nbytes)) { 2024 /* Wait for peripheral to become ready for MAXBUSYWAIT */ 2025 atppc->sc_outerr = atppc_poll_str(atppc, SPP_READY, SPP_MASK); 2026 if (atppc->sc_outerr) 2027 return; 2028 2029 /* Put data in data register */ 2030 atppc_w_dtr(atppc, *(atppc->sc_outbstart)); 2031 atppc_barrier_w(atppc); 2032 DELAY(1); 2033 2034 /* Pulse strobe to indicate valid data on lines */ 2035 ctr |= STROBE; 2036 atppc_w_ctr(atppc, ctr); 2037 atppc_barrier_w(atppc); 2038 DELAY(1); 2039 ctr &= ~STROBE; 2040 atppc_w_ctr(atppc, ctr); 2041 atppc_barrier_w(atppc); 2042 2043 /* Wait for nACK for MAXBUSYWAIT */ 2044 timecount = 0; 2045 if (atppc->sc_use & ATPPC_USE_INTR) { 2046 atppc->sc_outerr = atppc_wait_interrupt(atppc, 2047 atppc->sc_outb, ATPPC_IRQ_nACK); 2048 if (atppc->sc_outerr) 2049 return; 2050 } else { 2051 /* Try to catch the pulsed acknowledgement */ 2052 atppc->sc_outerr = atppc_poll_str(atppc, 0, nACK); 2053 if (atppc->sc_outerr) 2054 return; 2055 atppc->sc_outerr = atppc_poll_str(atppc, nACK, nACK); 2056 if (atppc->sc_outerr) 2057 return; 2058 } 2059 2060 /* Update buffer position, byte count and counter */ 2061 atppc->sc_outbstart++; 2062 } 2063 } 2064 2065 2066 /* Write bytes in EPP mode */ 2067 static void 2068 atppc_epp_write(struct atppc_softc *atppc) 2069 { 2070 if (atppc->sc_epp == ATPPC_EPP_1_9) { 2071 { 2072 uint8_t str; 2073 int i; 2074 2075 atppc_reset_epp_timeout((struct device *)atppc); 2076 for (i = 0; i < atppc->sc_outb_nbytes; i++) { 2077 atppc_w_eppD(atppc, *(atppc->sc_outbstart)); 2078 atppc_barrier_w(atppc); 2079 str = atppc_r_str(atppc); 2080 atppc_barrier_r(atppc); 2081 if (str & TIMEOUT) { 2082 atppc->sc_outerr = EIO; 2083 break; 2084 } 2085 atppc->sc_outbstart++; 2086 } 2087 } 2088 } else { 2089 /* Write data block to EPP data register */ 2090 atppc_w_eppD_multi(atppc, atppc->sc_outbstart, 2091 atppc->sc_outb_nbytes); 2092 atppc_barrier_w(atppc); 2093 /* Update buffer position, byte count and counter */ 2094 atppc->sc_outbstart += atppc->sc_outb_nbytes; 2095 } 2096 2097 return; 2098 } 2099 2100 2101 /* Write bytes in ECP/Fast Centronics mode */ 2102 static void 2103 atppc_fifo_write(struct atppc_softc * const atppc) 2104 { 2105 unsigned char ctr; 2106 unsigned char ecr; 2107 const unsigned char ctr_sav = atppc_r_ctr(atppc); 2108 const unsigned char ecr_sav = atppc_r_ecr(atppc); 2109 2110 ctr = ctr_sav; 2111 ecr = ecr_sav; 2112 atppc_barrier_r(atppc); 2113 2114 /* Reset and flush FIFO */ 2115 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 2116 atppc_barrier_w(atppc); 2117 /* Disable nAck interrupts and initialize port bits */ 2118 ctr &= ~(IRQENABLE | STROBE | AUTOFEED); 2119 atppc_w_ctr(atppc, ctr); 2120 atppc_barrier_w(atppc); 2121 /* Restore mode */ 2122 atppc_w_ecr(atppc, ecr); 2123 atppc_barrier_w(atppc); 2124 2125 /* DMA or Programmed IO */ 2126 if ((atppc->sc_use & ATPPC_USE_DMA) && 2127 (atppc->sc_use & ATPPC_USE_INTR)) { 2128 2129 atppc_fifo_write_dma(atppc, ecr, ctr); 2130 } else { 2131 atppc_fifo_write_pio(atppc, ecr, ctr); 2132 } 2133 2134 /* Restore original register values */ 2135 atppc_w_ctr(atppc, ctr_sav); 2136 atppc_w_ecr(atppc, ecr_sav); 2137 atppc_barrier_w(atppc); 2138 } 2139 2140 static void 2141 atppc_fifo_write_dma(struct atppc_softc * const atppc, unsigned char ecr, 2142 unsigned char ctr) 2143 { 2144 unsigned int len; 2145 unsigned int worklen; 2146 2147 for (len = (atppc->sc_outb + atppc->sc_outb_nbytes) - 2148 atppc->sc_outbstart; len > 0; len = (atppc->sc_outb + 2149 atppc->sc_outb_nbytes) - atppc->sc_outbstart) { 2150 2151 /* Wait for device to become ready */ 2152 atppc->sc_outerr = atppc_poll_str(atppc, SPP_READY, SPP_MASK); 2153 if (atppc->sc_outerr) 2154 return; 2155 2156 /* Reset chipset for next DMA transfer */ 2157 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 2158 atppc_barrier_w(atppc); 2159 atppc_w_ecr(atppc, ecr); 2160 atppc_barrier_w(atppc); 2161 2162 /* Limit transfer to maximum DMA size and start it */ 2163 worklen = min(len, atppc->sc_dma_maxsize); 2164 atppc->sc_dmastat = ATPPC_DMA_INIT; 2165 atppc->sc_dma_start(atppc, atppc->sc_outbstart, 2166 worklen, ATPPC_DMA_MODE_WRITE); 2167 atppc->sc_dmastat = ATPPC_DMA_STARTED; 2168 2169 /* Enable interrupts, DMA */ 2170 ecr &= ~ATPPC_SERVICE_INTR; 2171 ecr |= ATPPC_ENABLE_DMA; 2172 atppc_w_ecr(atppc, ecr); 2173 atppc_barrier_w(atppc); 2174 2175 /* Wait for DMA completion */ 2176 atppc->sc_outerr = atppc_wait_interrupt(atppc, atppc->sc_outb, 2177 ATPPC_IRQ_DMA); 2178 if (atppc->sc_outerr) { 2179 atppc_fifo_write_error(atppc, worklen); 2180 return; 2181 } 2182 /* Get register value recorded by interrupt handler */ 2183 ecr = atppc->sc_ecr_intr; 2184 /* Clear DMA programming */ 2185 atppc->sc_dma_finish(atppc); 2186 atppc->sc_dmastat = ATPPC_DMA_COMPLETE; 2187 /* Disable DMA */ 2188 ecr &= ~ATPPC_ENABLE_DMA; 2189 atppc_w_ecr(atppc, ecr); 2190 atppc_barrier_w(atppc); 2191 2192 /* Wait for FIFO to empty */ 2193 for (;;) { 2194 if (ecr & ATPPC_FIFO_EMPTY) { 2195 if (ecr & ATPPC_FIFO_FULL) { 2196 atppc->sc_outerr = EIO; 2197 atppc_fifo_write_error(atppc, worklen); 2198 return; 2199 } else { 2200 break; 2201 } 2202 } 2203 2204 /* Enable service interrupt */ 2205 ecr &= ~ATPPC_SERVICE_INTR; 2206 atppc_w_ecr(atppc, ecr); 2207 atppc_barrier_w(atppc); 2208 2209 atppc->sc_outerr = atppc_wait_interrupt(atppc, 2210 atppc->sc_outb, ATPPC_IRQ_FIFO); 2211 if (atppc->sc_outerr) { 2212 atppc_fifo_write_error(atppc, worklen); 2213 return; 2214 } 2215 2216 /* Get register value recorded by interrupt handler */ 2217 ecr = atppc->sc_ecr_intr; 2218 } 2219 2220 /* Update pointer */ 2221 atppc->sc_outbstart += worklen; 2222 } 2223 } 2224 2225 static void 2226 atppc_fifo_write_pio(struct atppc_softc * const atppc, unsigned char ecr, 2227 unsigned char ctr) 2228 { 2229 unsigned int len; 2230 unsigned int worklen; 2231 unsigned int timecount; 2232 2233 /* Disable DMA */ 2234 ecr &= ~ATPPC_ENABLE_DMA; 2235 atppc_w_ecr(atppc, ecr); 2236 atppc_barrier_w(atppc); 2237 2238 for (len = (atppc->sc_outb + atppc->sc_outb_nbytes) - 2239 atppc->sc_outbstart; len > 0; len = (atppc->sc_outb + 2240 atppc->sc_outb_nbytes) - atppc->sc_outbstart) { 2241 2242 /* Wait for device to become ready */ 2243 atppc->sc_outerr = atppc_poll_str(atppc, SPP_READY, SPP_MASK); 2244 if (atppc->sc_outerr) 2245 return; 2246 2247 /* Limit transfer to minimum of space in FIFO and buffer */ 2248 worklen = min(len, atppc->sc_fifo); 2249 2250 /* Write to FIFO */ 2251 atppc_w_fifo_multi(atppc, atppc->sc_outbstart, worklen); 2252 2253 timecount = 0; 2254 if (atppc->sc_use & ATPPC_USE_INTR) { 2255 ecr = atppc_r_ecr(atppc); 2256 atppc_barrier_w(atppc); 2257 2258 /* Wait for interrupt */ 2259 for (;;) { 2260 if (ecr & ATPPC_FIFO_EMPTY) { 2261 if (ecr & ATPPC_FIFO_FULL) { 2262 atppc->sc_outerr = EIO; 2263 atppc_fifo_write_error(atppc, 2264 worklen); 2265 return; 2266 } else { 2267 break; 2268 } 2269 } 2270 2271 /* Enable service interrupt */ 2272 ecr &= ~ATPPC_SERVICE_INTR; 2273 atppc_w_ecr(atppc, ecr); 2274 atppc_barrier_w(atppc); 2275 2276 atppc->sc_outerr = atppc_wait_interrupt(atppc, 2277 atppc->sc_outb, ATPPC_IRQ_FIFO); 2278 if (atppc->sc_outerr) { 2279 atppc_fifo_write_error(atppc, worklen); 2280 return; 2281 } 2282 2283 /* Get ECR value saved by interrupt handler */ 2284 ecr = atppc->sc_ecr_intr; 2285 } 2286 } else { 2287 for (; timecount < ((MAXBUSYWAIT/hz)*1000000); 2288 timecount++) { 2289 2290 ecr = atppc_r_ecr(atppc); 2291 atppc_barrier_r(atppc); 2292 if (ecr & ATPPC_FIFO_EMPTY) { 2293 if (ecr & ATPPC_FIFO_FULL) { 2294 atppc->sc_outerr = EIO; 2295 atppc_fifo_write_error(atppc, 2296 worklen); 2297 return; 2298 } else { 2299 break; 2300 } 2301 } 2302 DELAY(1); 2303 } 2304 2305 if (((timecount*hz)/1000000) >= MAXBUSYWAIT) { 2306 atppc->sc_outerr = EIO; 2307 atppc_fifo_write_error(atppc, worklen); 2308 return; 2309 } 2310 } 2311 2312 /* Update pointer */ 2313 atppc->sc_outbstart += worklen; 2314 } 2315 } 2316 2317 static void 2318 atppc_fifo_write_error(struct atppc_softc * const atppc, 2319 const unsigned int worklen) 2320 { 2321 unsigned char ecr = atppc_r_ecr(atppc); 2322 2323 /* Abort DMA if not finished */ 2324 if (atppc->sc_dmastat == ATPPC_DMA_STARTED) { 2325 atppc->sc_dma_abort(atppc); 2326 ATPPC_DPRINTF(("%s: DMA interrupted.\n", __func__)); 2327 } 2328 2329 /* Check for invalid states */ 2330 if ((ecr & ATPPC_FIFO_EMPTY) && (ecr & ATPPC_FIFO_FULL)) { 2331 ATPPC_DPRINTF(("%s: FIFO full+empty bits set.\n", __func__)); 2332 } else if (!(ecr & ATPPC_FIFO_EMPTY)) { 2333 unsigned char ctr = atppc_r_ctr(atppc); 2334 int bytes_left; 2335 int i; 2336 2337 ATPPC_DPRINTF(("%s(%s): FIFO not empty.\n", __func__, 2338 atppc->sc_dev.dv_xname)); 2339 2340 /* Drive strobe low to stop data transfer */ 2341 ctr &= ~STROBE; 2342 atppc_w_ctr(atppc, ctr); 2343 atppc_barrier_w(atppc); 2344 2345 /* Determine how many bytes remain in FIFO */ 2346 for (i = 0; i < atppc->sc_fifo; i++) { 2347 atppc_w_fifo(atppc, (unsigned char)i); 2348 ecr = atppc_r_ecr(atppc); 2349 atppc_barrier_r(atppc); 2350 if (ecr & ATPPC_FIFO_FULL) 2351 break; 2352 } 2353 bytes_left = (atppc->sc_fifo) - (i + 1); 2354 ATPPC_DPRINTF(("%s: %d bytes left in FIFO.\n", __func__, 2355 bytes_left)); 2356 2357 /* Update counter */ 2358 atppc->sc_outbstart += (worklen - bytes_left); 2359 } else { 2360 /* Update counter */ 2361 atppc->sc_outbstart += worklen; 2362 } 2363 2364 ATPPC_DPRINTF(("%s: reseting FIFO.\n", __func__)); 2365 atppc_w_ecr(atppc, ATPPC_ECR_PS2); 2366 atppc_barrier_w(atppc); 2367 } 2368 2369 /* 2370 * Poll status register using mask and status for MAXBUSYWAIT. 2371 * Returns 0 if device ready, error value otherwise. 2372 */ 2373 static int 2374 atppc_poll_str(const struct atppc_softc * const atppc, const u_int8_t status, 2375 const u_int8_t mask) 2376 { 2377 unsigned int timecount; 2378 u_int8_t str; 2379 int error = EIO; 2380 2381 /* Wait for str to have status for MAXBUSYWAIT */ 2382 for (timecount = 0; timecount < ((MAXBUSYWAIT/hz)*1000000); 2383 timecount++) { 2384 2385 str = atppc_r_str(atppc); 2386 atppc_barrier_r(atppc); 2387 if ((str & mask) == status) { 2388 error = 0; 2389 break; 2390 } 2391 DELAY(1); 2392 } 2393 2394 return error; 2395 } 2396 2397 /* Wait for interrupt for MAXBUSYWAIT: returns 0 if acknowledge received. */ 2398 static int 2399 atppc_wait_interrupt(struct atppc_softc * const atppc, const caddr_t where, 2400 const u_int8_t irqstat) 2401 { 2402 int error = EIO; 2403 2404 atppc->sc_irqstat &= ~irqstat; 2405 2406 /* Wait for interrupt for MAXBUSYWAIT */ 2407 error = ltsleep(where, PPBUSPRI | PCATCH, __func__, MAXBUSYWAIT, 2408 ATPPC_SC_LOCK(atppc)); 2409 2410 if (!(error) && (atppc->sc_irqstat & irqstat)) { 2411 atppc->sc_irqstat &= ~irqstat; 2412 error = 0; 2413 } 2414 2415 return error; 2416 } 2417