11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: diddfunc.c,v 1.14.6.2 2004/08/28 20:03:53 armin Exp $
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DIDD Interface module for Eicon active cards.
4475be4d85a274d0961593db41cf85689db1d583cJoe Perches *
5475be4d85a274d0961593db41cf85689db1d583cJoe Perches * Functions are in dadapter.c
6475be4d85a274d0961593db41cf85689db1d583cJoe Perches *
7475be4d85a274d0961593db41cf85689db1d583cJoe Perches * Copyright 2002-2003 by Armin Schindler (mac@melware.de)
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright 2002-2003 Cytronics & Melware (info@melware.de)
9475be4d85a274d0961593db41cf85689db1d583cJoe Perches *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference.
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "platform.h"
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "di_defs.h"
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "dadapter.h"
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "divasync.h"
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_MINIMUM  (DL_LOG + DL_FTL + DL_ERR)
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_DEFAULT  (DBG_MINIMUM + DL_XLOG + DL_REG)
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void DIVA_DIDD_Read(void *, int);
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern char *DRIVERRELEASE_DIDD;
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic dword notify_handle;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DESCRIPTOR _DAdapter;
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * didd callback function
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
31475be4d85a274d0961593db41cf85689db1d583cJoe Perchesstatic void *didd_callback(void *context, DESCRIPTOR *adapter,
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   int removal)
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (adapter->type == IDI_DADAPTER) {
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_ERR(("Notification about IDI_DADAPTER change ! Oops."))
36475be4d85a274d0961593db41cf85689db1d583cJoe Perches			return (NULL);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (adapter->type == IDI_DIMAINT) {
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (removal) {
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DbgDeregister();
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (NULL);
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * connect to didd
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int DIVA_INIT_FUNCTION connect_didd(void)
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int x = 0;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int dadapter = 0;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IDI_SYNC_REQ req;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DESCRIPTOR DIDD_Table[MAX_DESCRIPTORS];
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DIVA_DIDD_Read(DIDD_Table, sizeof(DIDD_Table));
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (x = 0; x < MAX_DESCRIPTORS; x++) {
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (DIDD_Table[x].type == IDI_DADAPTER) {	/* DADAPTER found */
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dadapter = 1;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			memcpy(&_DAdapter, &DIDD_Table[x], sizeof(_DAdapter));
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			req.didd_notify.e.Req = 0;
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			req.didd_notify.e.Rc =
65475be4d85a274d0961593db41cf85689db1d583cJoe Perches				IDI_SYNC_REQ_DIDD_REGISTER_ADAPTER_NOTIFY;
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			req.didd_notify.info.callback = (void *)didd_callback;
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			req.didd_notify.info.context = NULL;
68475be4d85a274d0961593db41cf85689db1d583cJoe Perches			_DAdapter.request((ENTITY *)&req);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (req.didd_notify.e.Rc != 0xff)
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return (0);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			notify_handle = req.didd_notify.info.handle;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else if (DIDD_Table[x].type == IDI_DIMAINT) {	/* MAINT found */
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DbgRegister("DIDD", DRIVERRELEASE_DIDD, DBG_DEFAULT);
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (dadapter);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * disconnect from didd
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DIVA_EXIT_FUNCTION disconnect_didd(void)
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IDI_SYNC_REQ req;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	req.didd_notify.e.Req = 0;
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	req.didd_notify.e.Rc = IDI_SYNC_REQ_DIDD_REMOVE_ADAPTER_NOTIFY;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	req.didd_notify.info.handle = notify_handle;
89475be4d85a274d0961593db41cf85689db1d583cJoe Perches	_DAdapter.request((ENTITY *)&req);
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * init
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint DIVA_INIT_FUNCTION diddfunc_init(void)
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	diva_didd_load_time_init();
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!connect_didd()) {
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		DBG_ERR(("init: failed to connect to DIDD."))
101475be4d85a274d0961593db41cf85689db1d583cJoe Perches			diva_didd_load_time_finit();
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return (0);
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (1);
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * finit
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid DIVA_EXIT_FUNCTION diddfunc_finit(void)
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DbgDeregister();
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	disconnect_didd();
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	diva_didd_load_time_finit();
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
116