11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * ds.h -- 16-bit PCMCIA core support 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 51da177e4SLinus Torvalds * it under the terms of the GNU General Public License version 2 as 61da177e4SLinus Torvalds * published by the Free Software Foundation. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * The initial developer of the original code is David A. Hinds 91da177e4SLinus Torvalds * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds 101da177e4SLinus Torvalds * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. 111da177e4SLinus Torvalds * 121da177e4SLinus Torvalds * (C) 1999 David A. Hinds 13a5835786SDominik Brodowski * (C) 2003 - 2008 Dominik Brodowski 141da177e4SLinus Torvalds */ 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #ifndef _LINUX_DS_H 171da177e4SLinus Torvalds #define _LINUX_DS_H 181da177e4SLinus Torvalds 198e2f3b70SDominik Brodowski #ifdef __KERNEL__ 208e2f3b70SDominik Brodowski #include <linux/mod_devicetable.h> 218e2f3b70SDominik Brodowski #endif 228e2f3b70SDominik Brodowski 231da177e4SLinus Torvalds #include <pcmcia/cs_types.h> 241ad275e3SDominik Brodowski #include <pcmcia/device_id.h> 251da177e4SLinus Torvalds 26a5835786SDominik Brodowski #ifdef __KERNEL__ 27a5835786SDominik Brodowski #include <linux/device.h> 28a5835786SDominik Brodowski #include <pcmcia/ss.h> 29a5835786SDominik Brodowski 30a5835786SDominik Brodowski /* 31a5835786SDominik Brodowski * PCMCIA device drivers (16-bit cards only; 32-bit cards require CardBus 32a5835786SDominik Brodowski * a.k.a. PCI drivers 33a5835786SDominik Brodowski */ 34a5835786SDominik Brodowski struct pcmcia_socket; 35a5835786SDominik Brodowski struct pcmcia_device; 36a5835786SDominik Brodowski struct config_t; 37*91284224SDominik Brodowski struct net_device; 38a5835786SDominik Brodowski 39a5835786SDominik Brodowski /* dynamic device IDs for PCMCIA device drivers. See 40a5835786SDominik Brodowski * Documentation/pcmcia/driver.txt for details. 41a5835786SDominik Brodowski */ 42a5835786SDominik Brodowski struct pcmcia_dynids { 43a5835786SDominik Brodowski spinlock_t lock; 44a5835786SDominik Brodowski struct list_head list; 45a5835786SDominik Brodowski }; 46a5835786SDominik Brodowski 47a5835786SDominik Brodowski struct pcmcia_driver { 48a5835786SDominik Brodowski int (*probe) (struct pcmcia_device *dev); 49a5835786SDominik Brodowski void (*remove) (struct pcmcia_device *dev); 50a5835786SDominik Brodowski 51a5835786SDominik Brodowski int (*suspend) (struct pcmcia_device *dev); 52a5835786SDominik Brodowski int (*resume) (struct pcmcia_device *dev); 53a5835786SDominik Brodowski 54a5835786SDominik Brodowski struct module *owner; 55a5835786SDominik Brodowski struct pcmcia_device_id *id_table; 56a5835786SDominik Brodowski struct device_driver drv; 57a5835786SDominik Brodowski struct pcmcia_dynids dynids; 58a5835786SDominik Brodowski }; 59a5835786SDominik Brodowski 60a5835786SDominik Brodowski /* driver registration */ 61a5835786SDominik Brodowski int pcmcia_register_driver(struct pcmcia_driver *driver); 62a5835786SDominik Brodowski void pcmcia_unregister_driver(struct pcmcia_driver *driver); 63a5835786SDominik Brodowski 64a5835786SDominik Brodowski /* Some drivers use dev_node_t to store char or block device information. 65a5835786SDominik Brodowski * Don't use this in new drivers, though. 66a5835786SDominik Brodowski */ 67a5835786SDominik Brodowski typedef struct dev_node_t { 68a5835786SDominik Brodowski char dev_name[DEV_NAME_LEN]; 69a5835786SDominik Brodowski u_short major, minor; 70a5835786SDominik Brodowski struct dev_node_t *next; 71a5835786SDominik Brodowski } dev_node_t; 72a5835786SDominik Brodowski 73a5835786SDominik Brodowski struct pcmcia_device { 74a5835786SDominik Brodowski /* the socket and the device_no [for multifunction devices] 75a5835786SDominik Brodowski uniquely define a pcmcia_device */ 76a5835786SDominik Brodowski struct pcmcia_socket *socket; 77a5835786SDominik Brodowski 78a5835786SDominik Brodowski char *devname; 79a5835786SDominik Brodowski 80a5835786SDominik Brodowski u8 device_no; 81a5835786SDominik Brodowski 82a5835786SDominik Brodowski /* the hardware "function" device; certain subdevices can 83a5835786SDominik Brodowski * share one hardware "function" device. */ 84a5835786SDominik Brodowski u8 func; 85a5835786SDominik Brodowski struct config_t* function_config; 86a5835786SDominik Brodowski 87a5835786SDominik Brodowski struct list_head socket_device_list; 88a5835786SDominik Brodowski 89a5835786SDominik Brodowski /* deprecated, will be cleaned up soon */ 90a5835786SDominik Brodowski dev_node_t *dev_node; 91a5835786SDominik Brodowski u_int open; 92a5835786SDominik Brodowski io_req_t io; 93a5835786SDominik Brodowski irq_req_t irq; 94a5835786SDominik Brodowski config_req_t conf; 95a5835786SDominik Brodowski window_handle_t win; 96a5835786SDominik Brodowski 97a5835786SDominik Brodowski /* Is the device suspended, or in the process of 98a5835786SDominik Brodowski * being removed? */ 99a5835786SDominik Brodowski u16 suspended:1; 100a5835786SDominik Brodowski u16 _removed:1; 101a5835786SDominik Brodowski 102a5835786SDominik Brodowski /* Flags whether io, irq, win configurations were 103a5835786SDominik Brodowski * requested, and whether the configuration is "locked" */ 104a5835786SDominik Brodowski u16 _irq:1; 105a5835786SDominik Brodowski u16 _io:1; 106a5835786SDominik Brodowski u16 _win:4; 107a5835786SDominik Brodowski u16 _locked:1; 108a5835786SDominik Brodowski 109a5835786SDominik Brodowski /* Flag whether a "fuzzy" func_id based match is 110a5835786SDominik Brodowski * allowed. */ 111a5835786SDominik Brodowski u16 allow_func_id_match:1; 112a5835786SDominik Brodowski 113a5835786SDominik Brodowski /* information about this device */ 114a5835786SDominik Brodowski u16 has_manf_id:1; 115a5835786SDominik Brodowski u16 has_card_id:1; 116a5835786SDominik Brodowski u16 has_func_id:1; 117a5835786SDominik Brodowski 118a5835786SDominik Brodowski u16 reserved:3; 119a5835786SDominik Brodowski 120a5835786SDominik Brodowski u8 func_id; 121a5835786SDominik Brodowski u16 manf_id; 122a5835786SDominik Brodowski u16 card_id; 123a5835786SDominik Brodowski 124a5835786SDominik Brodowski char * prod_id[4]; 125a5835786SDominik Brodowski 126a5835786SDominik Brodowski u64 dma_mask; 127a5835786SDominik Brodowski struct device dev; 128a5835786SDominik Brodowski 129a5835786SDominik Brodowski #ifdef CONFIG_PCMCIA_IOCTL 130a5835786SDominik Brodowski /* device driver wanted by cardmgr */ 131a5835786SDominik Brodowski struct pcmcia_driver * cardmgr; 132a5835786SDominik Brodowski #endif 133a5835786SDominik Brodowski 134a5835786SDominik Brodowski /* data private to drivers */ 135a5835786SDominik Brodowski void *priv; 136a5835786SDominik Brodowski }; 137a5835786SDominik Brodowski 138a5835786SDominik Brodowski #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) 139a5835786SDominik Brodowski #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) 140a5835786SDominik Brodowski 141a5835786SDominik Brodowski /* deprecated -- don't use! */ 142a5835786SDominik Brodowski #define handle_to_dev(handle) (handle->dev) 143a5835786SDominik Brodowski 144a5835786SDominik Brodowski 145a5835786SDominik Brodowski /* (deprecated) error reporting by PCMCIA devices. Use dev_printk() 146a5835786SDominik Brodowski * or dev_dbg() directly in the driver, without referring to pcmcia_error_func() 147a5835786SDominik Brodowski * and/or pcmcia_error_ret() for those functions will go away soon. 148a5835786SDominik Brodowski */ 149994917f8SDominik Brodowski enum service { 150994917f8SDominik Brodowski AccessConfigurationRegister, AddSocketServices, 151994917f8SDominik Brodowski AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory, 152994917f8SDominik Brodowski DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo, 153994917f8SDominik Brodowski GetClientInfo, GetConfigurationInfo, GetEventMask, 154994917f8SDominik Brodowski GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple, 155994917f8SDominik Brodowski GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple, 156994917f8SDominik Brodowski GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage, 157994917f8SDominik Brodowski MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow, 158994917f8SDominik Brodowski OpenMemory, ParseTuple, ReadMemory, RegisterClient, 159994917f8SDominik Brodowski RegisterEraseQueue, RegisterMTD, RegisterTimer, 160994917f8SDominik Brodowski ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ, 161994917f8SDominik Brodowski ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices, 162994917f8SDominik Brodowski RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ, 163994917f8SDominik Brodowski RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry, 164994917f8SDominik Brodowski SetEventMask, SetRegion, ValidateCIS, VendorSpecific, 165994917f8SDominik Brodowski WriteMemory, BindDevice, BindMTD, ReportError, 166994917f8SDominik Brodowski SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS, 167994917f8SDominik Brodowski GetFirstWindow, GetNextWindow, GetMemPage 168994917f8SDominik Brodowski }; 169a5835786SDominik Brodowski const char *pcmcia_error_func(int func); 170a5835786SDominik Brodowski const char *pcmcia_error_ret(int ret); 171a5835786SDominik Brodowski 172a5835786SDominik Brodowski #define cs_error(p_dev, func, ret) \ 173a5835786SDominik Brodowski { \ 174a5835786SDominik Brodowski dev_printk(KERN_NOTICE, &p_dev->dev, \ 175a5835786SDominik Brodowski "%s : %s\n", \ 176a5835786SDominik Brodowski pcmcia_error_func(func), \ 177a5835786SDominik Brodowski pcmcia_error_ret(ret)); \ 178a5835786SDominik Brodowski } 179a5835786SDominik Brodowski 180*91284224SDominik Brodowski 181*91284224SDominik Brodowski /* 182*91284224SDominik Brodowski * CIS access. 183*91284224SDominik Brodowski * 184*91284224SDominik Brodowski * Please use the following functions to access CIS tuples: 185*91284224SDominik Brodowski * - pcmcia_get_tuple() 186*91284224SDominik Brodowski * - pcmcia_loop_tuple() 187*91284224SDominik Brodowski * - pcmcia_get_mac_from_cis() 188*91284224SDominik Brodowski * 189*91284224SDominik Brodowski * To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface 190*91284224SDominik Brodowski * might change in future. 191272433e0SDominik Brodowski */ 192*91284224SDominik Brodowski 193*91284224SDominik Brodowski /* get the very first CIS entry of type @code. Note that buf is pointer 194*91284224SDominik Brodowski * to u8 *buf; and that you need to kfree(buf) afterwards. */ 195*91284224SDominik Brodowski size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code, 196*91284224SDominik Brodowski u8 **buf); 197*91284224SDominik Brodowski 198*91284224SDominik Brodowski /* loop over CIS entries */ 199*91284224SDominik Brodowski int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code, 200*91284224SDominik Brodowski int (*loop_tuple) (struct pcmcia_device *p_dev, 201*91284224SDominik Brodowski tuple_t *tuple, 202*91284224SDominik Brodowski void *priv_data), 203*91284224SDominik Brodowski void *priv_data); 204*91284224SDominik Brodowski 205*91284224SDominik Brodowski /* get the MAC address from CISTPL_FUNCE */ 206*91284224SDominik Brodowski int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev, 207*91284224SDominik Brodowski struct net_device *dev); 208*91284224SDominik Brodowski 209*91284224SDominik Brodowski 210*91284224SDominik Brodowski /* parse a tuple_t */ 211272433e0SDominik Brodowski int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse); 212272433e0SDominik Brodowski 213272433e0SDominik Brodowski /* loop CIS entries for valid configuration */ 214272433e0SDominik Brodowski int pcmcia_loop_config(struct pcmcia_device *p_dev, 215272433e0SDominik Brodowski int (*conf_check) (struct pcmcia_device *p_dev, 216272433e0SDominik Brodowski cistpl_cftable_entry_t *cf, 217272433e0SDominik Brodowski cistpl_cftable_entry_t *dflt, 218272433e0SDominik Brodowski unsigned int vcc, 219272433e0SDominik Brodowski void *priv_data), 220272433e0SDominik Brodowski void *priv_data); 221a5835786SDominik Brodowski 222994917f8SDominik Brodowski /* is the device still there? */ 223994917f8SDominik Brodowski struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev); 224994917f8SDominik Brodowski 225994917f8SDominik Brodowski /* low-level interface reset */ 226994917f8SDominik Brodowski int pcmcia_reset_card(struct pcmcia_socket *skt); 227994917f8SDominik Brodowski 228994917f8SDominik Brodowski /* CIS config */ 229994917f8SDominik Brodowski int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, 230994917f8SDominik Brodowski conf_reg_t *reg); 231994917f8SDominik Brodowski 232*91284224SDominik Brodowski /* deprecated -- do not use in drivers. */ 233*91284224SDominik Brodowski int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, 234*91284224SDominik Brodowski tuple_t *tuple); 235*91284224SDominik Brodowski #define pcmcia_get_first_tuple(p_dev, tuple) \ 236*91284224SDominik Brodowski pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple) 237*91284224SDominik Brodowski 238*91284224SDominik Brodowski int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, 239*91284224SDominik Brodowski tuple_t *tuple); 240*91284224SDominik Brodowski #define pcmcia_get_next_tuple(p_dev, tuple) \ 241*91284224SDominik Brodowski pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple) 242*91284224SDominik Brodowski 243*91284224SDominik Brodowski int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple); 244*91284224SDominik Brodowski #define pcmcia_get_tuple_data(p_dev, tuple) \ 245*91284224SDominik Brodowski pccard_get_tuple_data(p_dev->socket, tuple) 246*91284224SDominik Brodowski 247994917f8SDominik Brodowski /* device configuration */ 248994917f8SDominik Brodowski int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); 249994917f8SDominik Brodowski int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req); 250994917f8SDominik Brodowski int pcmcia_request_configuration(struct pcmcia_device *p_dev, 251994917f8SDominik Brodowski config_req_t *req); 252994917f8SDominik Brodowski 253994917f8SDominik Brodowski int pcmcia_request_window(struct pcmcia_device **p_dev, win_req_t *req, 254994917f8SDominik Brodowski window_handle_t *wh); 255994917f8SDominik Brodowski int pcmcia_release_window(window_handle_t win); 256994917f8SDominik Brodowski 257994917f8SDominik Brodowski int pcmcia_get_mem_page(window_handle_t win, memreq_t *req); 258994917f8SDominik Brodowski int pcmcia_map_mem_page(window_handle_t win, memreq_t *req); 259994917f8SDominik Brodowski 260994917f8SDominik Brodowski int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); 261994917f8SDominik Brodowski void pcmcia_disable_device(struct pcmcia_device *p_dev); 262994917f8SDominik Brodowski 263a5835786SDominik Brodowski #endif /* __KERNEL__ */ 264a5835786SDominik Brodowski 265a5835786SDominik Brodowski 266a5835786SDominik Brodowski 267a5835786SDominik Brodowski /* Below, there are only definitions which are used by 268a5835786SDominik Brodowski * - the PCMCIA ioctl 269a5835786SDominik Brodowski * - deprecated PCMCIA userspace tools only 270a5835786SDominik Brodowski * 271a5835786SDominik Brodowski * here be dragons ... here be dragons ... here be dragons ... here be drag 272a5835786SDominik Brodowski */ 273a5835786SDominik Brodowski 274a5835786SDominik Brodowski #if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__) 275a5835786SDominik Brodowski 276d39bd564SDominik Brodowski #if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \ 277d39bd564SDominik Brodowski defined(__bfin__) 278d39bd564SDominik Brodowski /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */ 279d39bd564SDominik Brodowski typedef u_int ioaddr_t; 280d39bd564SDominik Brodowski #else 281d39bd564SDominik Brodowski typedef u_short ioaddr_t; 282d39bd564SDominik Brodowski #endif 283d39bd564SDominik Brodowski 284a5835786SDominik Brodowski /* for AdjustResourceInfo */ 285a5835786SDominik Brodowski typedef struct adjust_t { 286a5835786SDominik Brodowski u_int Action; 287a5835786SDominik Brodowski u_int Resource; 288a5835786SDominik Brodowski u_int Attributes; 289a5835786SDominik Brodowski union { 290a5835786SDominik Brodowski struct memory { 291a5835786SDominik Brodowski u_long Base; 292a5835786SDominik Brodowski u_long Size; 293a5835786SDominik Brodowski } memory; 294a5835786SDominik Brodowski struct io { 295a5835786SDominik Brodowski ioaddr_t BasePort; 296a5835786SDominik Brodowski ioaddr_t NumPorts; 297a5835786SDominik Brodowski u_int IOAddrLines; 298a5835786SDominik Brodowski } io; 299a5835786SDominik Brodowski struct irq { 300a5835786SDominik Brodowski u_int IRQ; 301a5835786SDominik Brodowski } irq; 302a5835786SDominik Brodowski } resource; 303a5835786SDominik Brodowski } adjust_t; 304a5835786SDominik Brodowski 305a5835786SDominik Brodowski /* Action field */ 306a5835786SDominik Brodowski #define REMOVE_MANAGED_RESOURCE 1 307a5835786SDominik Brodowski #define ADD_MANAGED_RESOURCE 2 308a5835786SDominik Brodowski #define GET_FIRST_MANAGED_RESOURCE 3 309a5835786SDominik Brodowski #define GET_NEXT_MANAGED_RESOURCE 4 310a5835786SDominik Brodowski /* Resource field */ 311a5835786SDominik Brodowski #define RES_MEMORY_RANGE 1 312a5835786SDominik Brodowski #define RES_IO_RANGE 2 313a5835786SDominik Brodowski #define RES_IRQ 3 314a5835786SDominik Brodowski /* Attribute field */ 315a5835786SDominik Brodowski #define RES_IRQ_TYPE 0x03 316a5835786SDominik Brodowski #define RES_IRQ_TYPE_EXCLUSIVE 0 317a5835786SDominik Brodowski #define RES_IRQ_TYPE_TIME 1 318a5835786SDominik Brodowski #define RES_IRQ_TYPE_DYNAMIC 2 319a5835786SDominik Brodowski #define RES_IRQ_CSC 0x04 320a5835786SDominik Brodowski #define RES_SHARED 0x08 321a5835786SDominik Brodowski #define RES_RESERVED 0x10 322a5835786SDominik Brodowski #define RES_ALLOCATED 0x20 323a5835786SDominik Brodowski #define RES_REMOVED 0x40 324a5835786SDominik Brodowski 325a5835786SDominik Brodowski 3261da177e4SLinus Torvalds typedef struct tuple_parse_t { 3271da177e4SLinus Torvalds tuple_t tuple; 3281da177e4SLinus Torvalds cisdata_t data[255]; 3291da177e4SLinus Torvalds cisparse_t parse; 3301da177e4SLinus Torvalds } tuple_parse_t; 3311da177e4SLinus Torvalds 3321da177e4SLinus Torvalds typedef struct win_info_t { 3331da177e4SLinus Torvalds window_handle_t handle; 3341da177e4SLinus Torvalds win_req_t window; 3351da177e4SLinus Torvalds memreq_t map; 3361da177e4SLinus Torvalds } win_info_t; 3371da177e4SLinus Torvalds 3381da177e4SLinus Torvalds typedef struct bind_info_t { 3391da177e4SLinus Torvalds dev_info_t dev_info; 3401da177e4SLinus Torvalds u_char function; 341fd238232SDominik Brodowski struct pcmcia_device *instance; 3421da177e4SLinus Torvalds char name[DEV_NAME_LEN]; 3431da177e4SLinus Torvalds u_short major, minor; 3441da177e4SLinus Torvalds void *next; 3451da177e4SLinus Torvalds } bind_info_t; 3461da177e4SLinus Torvalds 3471da177e4SLinus Torvalds typedef struct mtd_info_t { 3481da177e4SLinus Torvalds dev_info_t dev_info; 3491da177e4SLinus Torvalds u_int Attributes; 3501da177e4SLinus Torvalds u_int CardOffset; 3511da177e4SLinus Torvalds } mtd_info_t; 3521da177e4SLinus Torvalds 353ae49ec92SMagnus Damm typedef struct region_info_t { 354ae49ec92SMagnus Damm u_int Attributes; 355ae49ec92SMagnus Damm u_int CardOffset; 356ae49ec92SMagnus Damm u_int RegionSize; 357ae49ec92SMagnus Damm u_int AccessSpeed; 358ae49ec92SMagnus Damm u_int BlockSize; 359ae49ec92SMagnus Damm u_int PartMultiple; 360ae49ec92SMagnus Damm u_char JedecMfr, JedecInfo; 361ae49ec92SMagnus Damm memory_handle_t next; 362ae49ec92SMagnus Damm } region_info_t; 363a5835786SDominik Brodowski 364ae49ec92SMagnus Damm #define REGION_TYPE 0x0001 365ae49ec92SMagnus Damm #define REGION_TYPE_CM 0x0000 366ae49ec92SMagnus Damm #define REGION_TYPE_AM 0x0001 367ae49ec92SMagnus Damm #define REGION_PREFETCH 0x0008 368ae49ec92SMagnus Damm #define REGION_CACHEABLE 0x0010 369ae49ec92SMagnus Damm #define REGION_BAR_MASK 0xe000 370ae49ec92SMagnus Damm #define REGION_BAR_SHIFT 13 371ae49ec92SMagnus Damm 37253efec95SDominik Brodowski /* For ReplaceCIS */ 37353efec95SDominik Brodowski typedef struct cisdump_t { 37453efec95SDominik Brodowski u_int Length; 37553efec95SDominik Brodowski cisdata_t Data[CISTPL_MAX_CIS_SIZE]; 37653efec95SDominik Brodowski } cisdump_t; 37753efec95SDominik Brodowski 3781a53088cSDominik Brodowski /* for GetConfigurationInfo */ 3791a53088cSDominik Brodowski typedef struct config_info_t { 3801a53088cSDominik Brodowski u_char Function; 3811a53088cSDominik Brodowski u_int Attributes; 3821a53088cSDominik Brodowski u_int Vcc, Vpp1, Vpp2; 3831a53088cSDominik Brodowski u_int IntType; 3841a53088cSDominik Brodowski u_int ConfigBase; 3851a53088cSDominik Brodowski u_char Status, Pin, Copy, Option, ExtStatus; 3861a53088cSDominik Brodowski u_int Present; 3871a53088cSDominik Brodowski u_int CardValues; 3881a53088cSDominik Brodowski u_int AssignedIRQ; 3891a53088cSDominik Brodowski u_int IRQAttributes; 3901a53088cSDominik Brodowski ioaddr_t BasePort1; 3911a53088cSDominik Brodowski ioaddr_t NumPorts1; 3921a53088cSDominik Brodowski u_int Attributes1; 3931a53088cSDominik Brodowski ioaddr_t BasePort2; 3941a53088cSDominik Brodowski ioaddr_t NumPorts2; 3951a53088cSDominik Brodowski u_int Attributes2; 3961a53088cSDominik Brodowski u_int IOAddrLines; 3971a53088cSDominik Brodowski } config_info_t; 3981a53088cSDominik Brodowski 399a45b3fb1SDominik Brodowski /* For ValidateCIS */ 400a45b3fb1SDominik Brodowski typedef struct cisinfo_t { 401a45b3fb1SDominik Brodowski u_int Chains; 402a45b3fb1SDominik Brodowski } cisinfo_t; 403a45b3fb1SDominik Brodowski 404a45b3fb1SDominik Brodowski typedef struct cs_status_t { 405a45b3fb1SDominik Brodowski u_char Function; 406a45b3fb1SDominik Brodowski event_t CardState; 407a45b3fb1SDominik Brodowski event_t SocketState; 408a45b3fb1SDominik Brodowski } cs_status_t; 409a45b3fb1SDominik Brodowski 4101da177e4SLinus Torvalds typedef union ds_ioctl_arg_t { 4111da177e4SLinus Torvalds adjust_t adjust; 4121da177e4SLinus Torvalds config_info_t config; 4131da177e4SLinus Torvalds tuple_t tuple; 4141da177e4SLinus Torvalds tuple_parse_t tuple_parse; 4151da177e4SLinus Torvalds client_req_t client_req; 4161da177e4SLinus Torvalds cs_status_t status; 4171da177e4SLinus Torvalds conf_reg_t conf_reg; 4181da177e4SLinus Torvalds cisinfo_t cisinfo; 4191da177e4SLinus Torvalds region_info_t region; 4201da177e4SLinus Torvalds bind_info_t bind_info; 4211da177e4SLinus Torvalds mtd_info_t mtd_info; 4221da177e4SLinus Torvalds win_info_t win_info; 4231da177e4SLinus Torvalds cisdump_t cisdump; 4241da177e4SLinus Torvalds } ds_ioctl_arg_t; 4251da177e4SLinus Torvalds 4261da177e4SLinus Torvalds #define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) 4271da177e4SLinus Torvalds #define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) 4281da177e4SLinus Torvalds #define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) 4291da177e4SLinus Torvalds #define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) 4301da177e4SLinus Torvalds #define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) 4311da177e4SLinus Torvalds #define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) 4321da177e4SLinus Torvalds #define DS_RESET_CARD _IO ('d', 8) 4331da177e4SLinus Torvalds #define DS_GET_STATUS _IOWR('d', 9, cs_status_t) 4341da177e4SLinus Torvalds #define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) 4351da177e4SLinus Torvalds #define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) 4361da177e4SLinus Torvalds #define DS_SUSPEND_CARD _IO ('d', 12) 4371da177e4SLinus Torvalds #define DS_RESUME_CARD _IO ('d', 13) 4381da177e4SLinus Torvalds #define DS_EJECT_CARD _IO ('d', 14) 4391da177e4SLinus Torvalds #define DS_INSERT_CARD _IO ('d', 15) 4401da177e4SLinus Torvalds #define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) 4411da177e4SLinus Torvalds #define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) 4421da177e4SLinus Torvalds #define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) 4431da177e4SLinus Torvalds #define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) 4441da177e4SLinus Torvalds #define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) 4451da177e4SLinus Torvalds #define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) 4461da177e4SLinus Torvalds 4471da177e4SLinus Torvalds #define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) 4481da177e4SLinus Torvalds #define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) 4491da177e4SLinus Torvalds #define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) 4501da177e4SLinus Torvalds #define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) 4511da177e4SLinus Torvalds #define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) 4521da177e4SLinus Torvalds 453a5835786SDominik Brodowski 4549c8b7965SDominik Brodowski /* used in userspace only */ 4559c8b7965SDominik Brodowski #define CS_IN_USE 0x1e 4569c8b7965SDominik Brodowski 457994917f8SDominik Brodowski #define INFO_MASTER_CLIENT 0x01 458994917f8SDominik Brodowski #define INFO_IO_CLIENT 0x02 459994917f8SDominik Brodowski #define INFO_MTD_CLIENT 0x04 460994917f8SDominik Brodowski #define INFO_MEM_CLIENT 0x08 461994917f8SDominik Brodowski #define MAX_NUM_CLIENTS 3 462994917f8SDominik Brodowski 463994917f8SDominik Brodowski #define INFO_CARD_SHARE 0x10 464994917f8SDominik Brodowski #define INFO_CARD_EXCL 0x20 465994917f8SDominik Brodowski 4661da177e4SLinus Torvalds 467a5835786SDominik Brodowski #endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */ 4681da177e4SLinus Torvalds 4691da177e4SLinus Torvalds #endif /* _LINUX_DS_H */ 470