summaryrefslogtreecommitdiff
path: root/sys/dev/ppbus/ppi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ppbus/ppi.c')
-rw-r--r--sys/dev/ppbus/ppi.c324
1 files changed, 10 insertions, 314 deletions
diff --git a/sys/dev/ppbus/ppi.c b/sys/dev/ppbus/ppi.c
index e0072f3e4cda8..f742e4b56fae5 100644
--- a/sys/dev/ppbus/ppi.c
+++ b/sys/dev/ppbus/ppi.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: ppi.c,v 1.8 1998/12/07 21:58:16 archie Exp $
+ * $Id: ppi.c,v 1.6 1998/01/02 09:30:39 msmith Exp $
*
*/
#include "ppi.h"
@@ -34,35 +34,18 @@
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/kernel.h>
-#include <sys/uio.h>
#include <sys/malloc.h>
#include <sys/fcntl.h>
-#include <machine/clock.h>
-
#include <dev/ppbus/ppbconf.h>
-#include <dev/ppbus/ppb_msq.h>
-
-#include "opt_ppb_1284.h"
-
-#ifdef PERIPH_1284
-#include <dev/ppbus/ppb_1284.h>
-#endif
-
#include <dev/ppbus/ppi.h>
-#define BUFSIZE 512
struct ppi_data {
int ppi_unit;
int ppi_flags;
#define HAVE_PPBUS (1<<0)
-#define HAD_PPBUS (1<<1)
-
- int ppi_count;
- int ppi_mode; /* IEEE1284 mode */
- char ppi_buffer[BUFSIZE];
struct ppb_device ppi_dev;
};
@@ -87,41 +70,13 @@ DATA_SET(ppbdriver_set, ppidriver);
static d_open_t ppiopen;
static d_close_t ppiclose;
static d_ioctl_t ppiioctl;
-static d_write_t ppiwrite;
-static d_read_t ppiread;
#define CDEV_MAJOR 82
static struct cdevsw ppi_cdevsw =
- { ppiopen, ppiclose, ppiread, ppiwrite, /* 82 */
+ { ppiopen, ppiclose, noread, nowrite, /* 82 */
ppiioctl, nullstop, nullreset, nodevtotty,
seltrue, nommap, nostrat, "ppi", NULL, -1 };
-#ifdef PERIPH_1284
-
-static void
-ppi_enable_intr(struct ppi_data *ppi)
-{
- char r;
-
- r = ppb_rctr(&ppi->ppi_dev);
- ppb_wctr(&ppi->ppi_dev, r | IRQENABLE);
-
- return;
-}
-
-static void
-ppi_disable_intr(struct ppi_data *ppi)
-{
- char r;
-
- r = ppb_rctr(&ppi->ppi_dev);
- ppb_wctr(&ppi->ppi_dev, r & ~IRQENABLE);
-
- return;
-}
-
-#endif /* PERIPH_1284 */
-
/*
* ppiprobe()
*/
@@ -161,6 +116,8 @@ ppiprobe(struct ppb_data *ppb)
static int
ppiattach(struct ppb_device *dev)
{
+ struct ppi_data *ppi = ppidata[dev->id_unit];
+
/*
* Report ourselves
*/
@@ -170,72 +127,9 @@ ppiattach(struct ppb_device *dev)
return (1);
}
-/*
- * Cable
- * -----
- *
- * Use an IEEE1284 compliant (DB25/DB25) cable with the following tricks:
- *
- * nStrobe <-> nAck 1 <-> 10
- * nAutofd <-> Busy 11 <-> 14
- * nSelectin <-> Select 17 <-> 13
- * nInit <-> nFault 15 <-> 16
- *
- */
static void
ppiintr(int unit)
{
-#ifdef PERIPH_1284
- struct ppi_data *ppi = ppidata[unit];
-
- ppi_disable_intr(ppi);
-
- switch (ppi->ppi_dev.ppb->state) {
-
- /* accept IEEE1284 negociation then wakeup an waiting process to
- * continue negociation at process level */
- case PPB_FORWARD_IDLE:
- /* Event 1 */
- if ((ppb_rstr(&ppi->ppi_dev) & (SELECT | nBUSY)) ==
- (SELECT | nBUSY)) {
- /* IEEE1284 negociation */
-#ifdef DEBUG_1284
- printf("N");
-#endif
-
- /* Event 2 - prepare for reading the ext. value */
- ppb_wctr(&ppi->ppi_dev, (PCD | STROBE | nINIT) & ~SELECTIN);
-
- ppi->ppi_dev.ppb->state = PPB_NEGOCIATION;
-
- } else {
-#ifdef DEBUG_1284
- printf("0x%x", ppb_rstr(&ppi->ppi_dev));
-#endif
- ppb_peripheral_terminate(&ppi->ppi_dev, PPB_DONTWAIT);
- break;
- }
-
- /* wake up any process waiting for negociation from
- * remote master host */
-
- /* XXX should set a variable to warn the process about
- * the interrupt */
-
- wakeup(ppi);
- break;
- default:
-#ifdef DEBUG_1284
- printf("?%d", ppi->ppi_dev.ppb->state);
-#endif
- ppi->ppi_dev.ppb->state = PPB_FORWARD_IDLE;
- ppb_set_mode(&ppi->ppi_dev, PPB_COMPATIBLE);
- break;
- }
-
- ppi_enable_intr(ppi);
-#endif /* PERIPH_1284 */
-
return;
}
@@ -249,16 +143,11 @@ ppiopen(dev_t dev, int flags, int fmt, struct proc *p)
if (unit >= nppi)
return (ENXIO);
- if (!(ppi->ppi_flags & HAVE_PPBUS)) {
- if ((res = ppb_request_bus(&ppi->ppi_dev,
- (flags & O_NONBLOCK) ? PPB_DONTWAIT :
- (PPB_WAIT | PPB_INTR))))
+ if (!(ppi->ppi_flags & HAVE_PPBUS))
+ if ((res = ppb_request_bus(&ppi->ppi_dev, (flags & O_NONBLOCK) ? PPB_DONTWAIT : (PPB_WAIT | PPB_INTR))))
return (res);
- ppi->ppi_flags |= HAVE_PPBUS;
- }
- ppi->ppi_count += 1;
-
+ ppi->ppi_flags |= HAVE_PPBUS;
return (0);
}
@@ -268,206 +157,12 @@ ppiclose(dev_t dev, int flags, int fmt, struct proc *p)
u_int unit = minor(dev);
struct ppi_data *ppi = ppidata[unit];
- ppi->ppi_count --;
- if (!ppi->ppi_count) {
-
-#ifdef PERIPH_1284
- switch (ppi->ppi_dev.ppb->state) {
- case PPB_PERIPHERAL_IDLE:
- ppb_peripheral_terminate(&ppi->ppi_dev, 0);
- break;
- case PPB_REVERSE_IDLE:
- case PPB_EPP_IDLE:
- case PPB_ECP_FORWARD_IDLE:
- default:
- ppb_1284_terminate(&ppi->ppi_dev);
- break;
- }
-#endif /* PERIPH_1284 */
-
+ if (ppi->ppi_flags & HAVE_PPBUS)
ppb_release_bus(&ppi->ppi_dev);
- ppi->ppi_flags &= ~HAVE_PPBUS;
- }
-
+ ppi->ppi_flags &= ~HAVE_PPBUS;
return (0);
}
-/*
- * ppiread()
- *
- * IEEE1284 compliant read.
- *
- * First, try negociation to BYTE then NIBBLE mode
- * If no data is available, wait for it otherwise transfer as much as possible
- */
-static int
-ppiread(dev_t dev, struct uio *uio, int ioflag)
-{
-#ifdef PERIPH_1284
- u_int unit = minor(dev);
- struct ppi_data *ppi = ppidata[unit];
- int len, error = 0;
-
- switch (ppi->ppi_dev.ppb->state) {
- case PPB_PERIPHERAL_IDLE:
- ppb_peripheral_terminate(&ppi->ppi_dev, 0);
- /* fall throught */
-
- case PPB_FORWARD_IDLE:
- /* if can't negociate NIBBLE mode then try BYTE mode,
- * the peripheral may be a computer
- */
- if ((ppb_1284_negociate(&ppi->ppi_dev,
- ppi->ppi_mode = PPB_NIBBLE, 0))) {
-
- /* XXX Wait 2 seconds to let the remote host some
- * time to terminate its interrupt
- */
- tsleep(ppi, PPBPRI, "ppiread", 2*hz);
-
- if ((error = ppb_1284_negociate(&ppi->ppi_dev,
- ppi->ppi_mode = PPB_BYTE, 0)))
- return (error);
- }
- break;
-
- case PPB_REVERSE_IDLE:
- case PPB_EPP_IDLE:
- case PPB_ECP_FORWARD_IDLE:
- default:
- break;
- }
-
-#ifdef DEBUG_1284
- printf("N");
-#endif
- /* read data */
- len = 0;
- while (uio->uio_resid) {
- if ((error = ppb_1284_read(&ppi->ppi_dev, ppi->ppi_mode,
- ppi->ppi_buffer, min(BUFSIZE, uio->uio_resid),
- &len))) {
- goto error;
- }
-
- if (!len)
- goto error; /* no more data */
-
-#ifdef DEBUG_1284
- printf("d");
-#endif
- if ((error = uiomove(ppi->ppi_buffer, len, uio)))
- goto error;
- }
-
-error:
-
-#else /* PERIPH_1284 */
- int error = ENODEV;
-#endif
-
- return (error);
-}
-
-/*
- * ppiwrite()
- *
- * IEEE1284 compliant write
- *
- * Actually, this is the peripheral side of a remote IEEE1284 read
- *
- * The first part of the negociation (IEEE1284 device detection) is
- * done at interrupt level, then the remaining is done by the writing
- * process
- *
- * Once negociation done, transfer data
- */
-static int
-ppiwrite(dev_t dev, struct uio *uio, int ioflag)
-{
-#ifdef PERIPH_1284
- u_int unit = minor(dev);
- struct ppi_data *ppi = ppidata[unit];
- struct ppb_data *ppb = ppi->ppi_dev.ppb;
- int len, error = 0, sent;
-
-#if 0
- int ret;
-
- #define ADDRESS MS_PARAM(0, 0, MS_TYP_PTR)
- #define LENGTH MS_PARAM(0, 1, MS_TYP_INT)
-
- struct ppb_microseq msq[] = {
- { MS_OP_PUT, { MS_UNKNOWN, MS_UNKNOWN, MS_UNKNOWN } },
- MS_RET(0)
- };
-
- /* negociate ECP mode */
- if (ppb_1284_negociate(&ppi->ppi_dev, PPB_ECP, 0)) {
- printf("ppiwrite: ECP negociation failed\n");
- }
-
- while (!error && (len = min(uio->uio_resid, BUFSIZE))) {
- uiomove(ppi->ppi_buffer, len, uio);
-
- ppb_MS_init_msq(msq, 2, ADDRESS, ppi->ppi_buffer, LENGTH, len);
-
- error = ppb_MS_microseq(&ppi->ppi_dev, msq, &ret);
- }
-#endif
-
- /* we have to be peripheral to be able to send data, so
- * wait for the appropriate state
- */
- if (ppb->state < PPB_PERIPHERAL_NEGOCIATION)
- ppb_1284_terminate(&ppi->ppi_dev);
-
- while (ppb->state != PPB_PERIPHERAL_IDLE) {
- /* XXX should check a variable before sleeping */
-#ifdef DEBUG_1284
- printf("s");
-#endif
-
- ppi_enable_intr(ppi);
-
- /* sleep until IEEE1284 negociation starts */
- error = tsleep(ppi, PCATCH | PPBPRI, "ppiwrite", 0);
-
- switch (error) {
- case 0:
- /* negociate peripheral side with BYTE mode */
- ppb_peripheral_negociate(&ppi->ppi_dev, PPB_BYTE, 0);
- break;
- case EWOULDBLOCK:
- break;
- default:
- goto error;
- }
- }
-#ifdef DEBUG_1284
- printf("N");
-#endif
-
- /* negociation done, write bytes to master host */
- while (len = min(uio->uio_resid, BUFSIZE)) {
- uiomove(ppi->ppi_buffer, len, uio);
- if ((error = byte_peripheral_write(&ppi->ppi_dev,
- ppi->ppi_buffer, len, &sent)))
- goto error;
-#ifdef DEBUG_1284
- printf("d");
-#endif
- }
-
-error:
-
-#else /* PERIPH_1284 */
- int error = ENODEV;
-#endif
-
- return (error);
-}
-
static int
ppiioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
{
@@ -515,6 +210,7 @@ ppiioctl(dev_t dev, u_long cmd, caddr_t data, int flags, struct proc *p)
case PPISFIFO: /* write FIFO */
ppb_wfifo(&ppi->ppi_dev, *val);
break;
+
default:
error = ENOTTY;
break;