struct pccard_io_handle {
bus_space_tag_t iot;
bus_space_handle_t ioh;
bus_addr_t addr;
bus_size_t size;
int flags;
int width;
};
#define PCCARD_IO_ALLOCATED 0x01
struct pccard_mem_handle {
bus_space_tag_t memt;
bus_space_handle_t memh;
bus_addr_t addr;
bus_size_t size;
bus_size_t realsize;
bus_addr_t cardaddr;
int kind;
};
#define PCCARD_MEM_16BIT 1
#define PCCARD_MEM_ATTR 2
#define PCCARD_WIDTH_AUTO 0
#define PCCARD_WIDTH_IO8 1
#define PCCARD_WIDTH_IO16 2
struct pccard_tuple {
unsigned int code;
unsigned int length;
u_long mult;
bus_addr_t ptr;
bus_space_tag_t memt;
bus_space_handle_t memh;
};
typedef int (*pccard_scan_t)(const struct pccard_tuple *, void *);
struct pccard_product {
const char *pp_name;
#define PCCARD_VENDOR_ANY (0xffffffff)
uint32_t pp_vendor;
#define PCCARD_PRODUCT_ANY (0xffffffff)
uint32_t pp_product;
const char *pp_cis[4];
};
#define PCCARD_PNP_DESCR "D:#;V32:manufacturer;V32:product;Z:cisvendor;Z:cisproduct;"
#define PCCARD_PNP_INFO(t) \
MODULE_PNP_INFO(PCCARD_PNP_DESCR, pccard, t, t, nitems(t) - 1)
typedef int (*pccard_product_match_fn) (device_t dev,
const struct pccard_product *ent, int vpfmatch);
#include "card_if.h"
static inline const struct pccard_product *
pccard_product_lookup(device_t dev, const struct pccard_product *tab,
size_t ent_size, pccard_product_match_fn matchfn)
{
return CARD_DO_PRODUCT_LOOKUP(device_get_parent(dev), dev,
tab, ent_size, matchfn);
}
#define pccard_cis_read_1(tuple, idx0) \
(bus_space_read_1((tuple)->memt, (tuple)->memh, (tuple)->mult*(idx0)))
#define pccard_tuple_read_1(tuple, idx1) \
(pccard_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
#define pccard_tuple_read_2(tuple, idx2) \
(pccard_tuple_read_1((tuple), (idx2)) | \
(pccard_tuple_read_1((tuple), (idx2)+1)<<8))
#define pccard_tuple_read_3(tuple, idx3) \
(pccard_tuple_read_1((tuple), (idx3)) | \
(pccard_tuple_read_1((tuple), (idx3)+1)<<8) | \
(pccard_tuple_read_1((tuple), (idx3)+2)<<16))
#define pccard_tuple_read_4(tuple, idx4) \
(pccard_tuple_read_1((tuple), (idx4)) | \
(pccard_tuple_read_1((tuple), (idx4)+1)<<8) | \
(pccard_tuple_read_1((tuple), (idx4)+2)<<16) | \
(pccard_tuple_read_1((tuple), (idx4)+3)<<24))
#define pccard_tuple_read_n(tuple, n, idxn) \
(((n)==1)?pccard_tuple_read_1((tuple), (idxn)) : \
(((n)==2)?pccard_tuple_read_2((tuple), (idxn)) : \
(((n)==3)?pccard_tuple_read_3((tuple), (idxn)) : \
pccard_tuple_read_4((tuple), (idxn)))))
#define PCCARD_SPACE_MEMORY 1
#define PCCARD_SPACE_IO 2
#define pccard_mfc(sc) \
(STAILQ_FIRST(&(sc)->card.pf_head) && \
STAILQ_NEXT(STAILQ_FIRST(&(sc)->card.pf_head),pf_list))
static inline int
pccard_cis_scan(device_t dev, pccard_scan_t fct, void *arg)
{
return (CARD_CIS_SCAN(device_get_parent(dev), dev, fct, arg));
}
static inline int
pccard_attr_read_1(device_t dev, uint32_t offset, uint8_t *val)
{
return (CARD_ATTR_READ(device_get_parent(dev), dev, offset, val));
}
static inline int
pccard_attr_write_1(device_t dev, uint32_t offset, uint8_t val)
{
return (CARD_ATTR_WRITE(device_get_parent(dev), dev, offset, val));
}
static inline int
pccard_ccr_read_1(device_t dev, uint32_t offset, uint8_t *val)
{
return (CARD_CCR_READ(device_get_parent(dev), dev, offset, val));
}
static inline int
pccard_ccr_write_1(device_t dev, uint32_t offset, uint8_t val)
{
return (CARD_CCR_WRITE(device_get_parent(dev), dev, offset, val));
}
int pccard_select_cfe(device_t dev, int entry);
enum {
PCCARD_IVAR_ETHADDR = BUS_IVARS_PRIVATE,
PCCARD_IVAR_VENDOR,
PCCARD_IVAR_PRODUCT,
PCCARD_IVAR_PRODEXT,
PCCARD_IVAR_FUNCTION_NUMBER,
PCCARD_IVAR_VENDOR_STR,
PCCARD_IVAR_PRODUCT_STR,
PCCARD_IVAR_CIS3_STR,
PCCARD_IVAR_CIS4_STR,
PCCARD_IVAR_FUNCTION,
PCCARD_IVAR_FUNCE_DISK
};
#define PCCARD_ACCESSOR(A, B, T) \
static inline int \
pccard_get_ ## A(device_t dev, T *t) \
{ \
return BUS_READ_IVAR(device_get_parent(dev), dev, \
PCCARD_IVAR_ ## B, (uintptr_t *) t); \
}
PCCARD_ACCESSOR(ether, ETHADDR, uint8_t)
PCCARD_ACCESSOR(vendor, VENDOR, uint32_t)
PCCARD_ACCESSOR(product, PRODUCT, uint32_t)
PCCARD_ACCESSOR(prodext, PRODEXT, uint16_t)
PCCARD_ACCESSOR(function_number,FUNCTION_NUMBER, uint32_t)
PCCARD_ACCESSOR(function, FUNCTION, uint32_t)
PCCARD_ACCESSOR(funce_disk, FUNCE_DISK, uint16_t)
PCCARD_ACCESSOR(vendor_str, VENDOR_STR, const char *)
PCCARD_ACCESSOR(product_str, PRODUCT_STR, const char *)
PCCARD_ACCESSOR(cis3_str, CIS3_STR, const char *)
PCCARD_ACCESSOR(cis4_str, CIS4_STR, const char *)
enum {
PCCARD_A_MEM_COM,
PCCARD_A_MEM_ATTR,
PCCARD_A_MEM_8BIT,
PCCARD_A_MEM_16BIT
};
#define PCCARD_S(a, b) PCMCIA_STR_ ## a ## _ ## b
#define PCCARD_P(a, b) PCMCIA_PRODUCT_ ## a ## _ ## b
#define PCCARD_C(a, b) PCMCIA_CIS_ ## a ## _ ## b
#define PCMCIA_CARD_D(v, p) { PCCARD_S(v, p), PCMCIA_VENDOR_ ## v, \
PCCARD_P(v, p), PCCARD_C(v, p) }
#define PCMCIA_CARD(v, p) { PCCARD_S(v, p), PCMCIA_VENDOR_ ## v, \
PCCARD_P(v, p), PCCARD_C(v, p) }
#define PFD_I_V_MASK 0x3
#define PFD_I_V_NONE_REQUIRED 0x0
#define PFD_I_V_REQ_MOD_ACC 0x1
#define PFD_I_V_REQ_ACC 0x2
#define PFD_I_V_REQ_ALWYS 0x1
#define PFD_I_S 0x4
#define PFD_I_U 0x8
#define PFD_I_D 0x10
#define PFD_P_P0 0x100
#define PFD_P_P1 0x200
#define PFD_P_P2 0x400
#define PFD_P_P3 0x800
#define PFD_P_N 0x1000
#define PFD_P_E 0x2000
#define PFD_P_I 0x4000