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