From 1980018b8b6889ed4ce06b267a8c455f3a55fc62 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 15 Apr 2005 12:25:17 +0000 Subject: Cleaned up isolation protocol. --- src/include/isapnp.h | 159 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 111 insertions(+), 48 deletions(-) (limited to 'src/include') diff --git a/src/include/isapnp.h b/src/include/isapnp.h index 228823b29..c490e1ec3 100644 --- a/src/include/isapnp.h +++ b/src/include/isapnp.h @@ -18,69 +18,65 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Portions of this code: -* Copyright (C) 2001 P.J.H.Fox (fox@roestock.demon.co.uk) +* Copyright (C) 2001 P.J.H.Fox (fox@roestock.demon.co.uk) * * * * REVISION HISTORY: * ================ * Version 0.1 April 26, 2002 TJL -* Version 0.2 01/08/2003 TJL Renamed from 3c515_isapnp.h +* Version 0.2 01/08/2003 TJL Renamed from 3c515_isapnp.h +* +* +* Generalised into an ISAPnP bus that can be used by more than just +* the 3c515 by Michael Brown * ***************************************************************************/ -/*extern int read_port;*/ -/*#define DEBUG*/ -#define ADDRESS_ADDR 0x0279 -#define WRITEDATA_ADDR 0x0a79 -/* MIN and MAX READ_ADDR must have the bottom two bits set */ -#define MIN_READ_ADDR 0x0203 -#define START_READ_ADDR 0x203 -#define MAX_READ_ADDR 0x03ff -/* READ_ADDR_STEP must be a multiple of 4 */ -#ifndef READ_ADDR_STEP -#define READ_ADDR_STEP 8 -#endif - -#ifdef EDEBUG -static int x; -#define ADDRESS(x) (outb(x, ADDRESS_ADDR), printf("\nAddress: %hX", x)) -#define WRITE_DATA(x) (outb(x, WRITEDATA_ADDR), printf(" WR(%hX)", x & 0xff)) -#define READ_DATA (x = inb(read_port), printf(" RD(%hX)", x & 0xff), x) -#define READ_IOPORT(p) (x = inb(p), printf(" [%hX](%hX)", p, x & 0xff), x) -#else /* !DEBUG */ -#define ADDRESS(x) outb(x, ADDRESS_ADDR) -#define WRITE_DATA(x) outb(x, WRITEDATA_ADDR) -#define READ_DATA inb(read_port) -#define READ_IOPORT(p) inb(p) -#endif /* !DEBUG */ +#ifndef ISAPNP_H +#define ISAPNP_H +#include "isa_ids.h" +#include "dev.h" +/* + * ISAPnP constants + * + */ -#define INIT_LENGTH 32 - -#define INITDATA { 0x6a, 0xb5, 0xda, 0xed, 0xf6, 0xfb, 0x7d, 0xbe,\ - 0xdf, 0x6f, 0x37, 0x1b, 0x0d, 0x86, 0xc3, 0x61,\ - 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0x45, 0xa2, 0xd1,\ - 0xe8, 0x74, 0x3a, 0x9d, 0xce, 0xe7, 0x73, 0x39 } +/* Port addresses */ +#define ISAPNP_ADDRESS 0x279 +#define ISAPNP_WRITE_DATA 0xa79 +#define ISAPNP_READ_PORT_MIN 0x213 /* ISAPnP spec says 0x203, but + * Linux ISAPnP starts at + * 0x213 with no explanatory + * comment. 0x203 probably + * clashes with something. */ +#define ISAPNP_READ_PORT_MAX 0x3ff +#define ISAPNP_READ_PORT_STEP 0x08 /* Can be any multiple of 4 */ /* Registers */ -#define SetRdPort(x) (ADDRESS(0x00),WRITE_DATA((x)>>2),read_port=((x)|3)) -#define SERIALISOLATION ADDRESS(0x01) -#define CONFIGCONTROL ADDRESS(0x02) -#define Wake(x) (ADDRESS(0x03),WRITE_DATA(x)) -#define RESOURCEDATA (ADDRESS(0x04),READ_DATA) -#define STATUS (ADDRESS(0x05),READ_DATA) -#define CARDSELECTNUMBER ADDRESS(0x06) -#define LOGICALDEVICENUMBER ADDRESS(0x07) -#define ACTIVATE ADDRESS(0x30) -#define IORANGECHECK ADDRESS(0x31) +#define ISAPNP_READPORT 0x00 +#define ISAPNP_SERIALISOLATION 0x01 +#define ISAPNP_CONFIGCONTROL 0x02 +#define ISAPNP_WAKE 0x03 +#define ISAPNP_RESOURCEDATA 0x04 +#define ISAPNP_STATUS 0x05 +#define ISAPNP_CARDSELECTNUMBER 0x06 +#define ISAPNP_LOGICALDEVICENUMBER 0x07 +#define ISAPNP_ACTIVATE 0x30 +#define ISAPNP_IORANGECHECK 0x31 + +/* Bits in the CONFIGCONTROL register */ +#define ISAPNP_CONFIG_RESET ( 1 << 0 ) +#define ISAPNP_CONFIG_WAIT_FOR_KEY ( 1 << 1 ) +#define ISAPNP_CONFIG_RESET_CSN ( 1 << 2 ) +#define ISAPNP_CONFIG_RESET_DRV ( ISAPNP_CONFIG_RESET | \ + ISAPNP_CONFIG_WAIT_FOR_KEY | \ + ISAPNP_CONFIG_RESET_CSN ) -/* Bits */ -#define CONFIG_RESET 0x01 -#define CONFIG_WAIT_FOR_KEY 0x02 -#define CONFIG_RESET_CSN 0x04 -#define CONFIG_RESET_DRV 0x07 +/* The LFSR used for the initiation key and for checksumming */ +#define ISAPNP_LFSR_SEED 0x6a /* Short Tags */ #define PnPVerNo_TAG 0x01 @@ -122,3 +118,70 @@ static int x; #define RsvdLongE_TAG 0xFE #define RsvdLongF_TAG 0xFF #define NewBoard_PSEUDOTAG 0x100 + +/* + * An ISAPnP serial identifier + * + */ +union isapnp_identifier { + char bytes[9]; + struct { + uint16_t vendor_id; + uint16_t product_id; + uint32_t serial; + uint8_t checksum; + } __attribute__ (( packed )); +} __attribute__ (( packed )); + +/* + * A physical ISAPnP device + * + */ +struct isapnp_device { + char *magic; /* must be first */ + const char *name; + unsigned char csn; + uint16_t vendor_id; + uint16_t prod_id; + int already_tried; +}; + +/* + * An individual ISAPnP device identified by ID + * + */ +struct isapnp_id { + const char *name; + uint16_t vendor_id, prod_id; +}; + +/* + * An ISAPnP driver, with a device ID (struct isapnp_id) table. + * + */ +struct isapnp_driver { + const char *name; + struct isapnp_id *ids; + unsigned int id_count; +}; + +/* + * Define an ISAPnP driver + * + */ +#define ISAPNP_DRIVER( driver_name, isapnp_ids ) { \ + .name = driver_name, \ + .ids = isapnp_ids, \ + .id_count = sizeof ( isapnp_ids ) / sizeof ( isapnp_ids[0] ), \ +} + +/* + * Functions in isapnp.c + * + */ +extern int find_isapnp_device ( struct isapnp_device *isapnp, + struct isapnp_driver *driver ); +extern int find_isapnp_boot_device ( struct dev *dev, + struct isapnp_driver *driver ); + +#endif /* ISAPNP_H */ -- cgit v1.2.3-55-g7522