mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-22 15:47:37 +00:00
o Get rid of static array of slots in pccard layer. Move this to the
softc. o Store pointers to softc in dev_t in si_drv1. o Change 'kludge version' to 'classic version' since things are getting less kludgy. o Minor code shuffling so that we probe and attach the pccard slots. o Minor style(9) changes.
This commit is contained in:
parent
a3d8f94bd4
commit
804e80065b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=76538
@ -68,8 +68,6 @@ static void disable_slot(struct slot *);
|
||||
static void disable_slot_to(struct slot *);
|
||||
static void power_off_slot(void *);
|
||||
|
||||
static struct slot *pccard_slots[MAXSLOT]; /* slot entries */
|
||||
|
||||
/*
|
||||
* The driver interface for read/write uses a block
|
||||
* of memory in the ISA I/O memory space allocated via
|
||||
@ -172,31 +170,26 @@ disable_slot_to(struct slot *slt)
|
||||
}
|
||||
|
||||
/*
|
||||
* pccard_alloc_slot - Called from controller probe
|
||||
* routine, this function allocates a new PC-CARD slot
|
||||
* and initialises the data structures using the data provided.
|
||||
* It returns the allocated structure to the probe routine
|
||||
* to allow the controller specific data to be initialised.
|
||||
* pccard_init_slot - Initialize the slot controller and attach various
|
||||
* things to it. We also make the device for it. We create the device that
|
||||
* will be exported to devfs.
|
||||
*/
|
||||
struct slot *
|
||||
pccard_alloc_slot(struct slot_ctrl *ctrl)
|
||||
pccard_init_slot(device_t dev, struct slot_ctrl *ctrl)
|
||||
{
|
||||
struct slot *slt;
|
||||
int slotno;
|
||||
int slotno;
|
||||
struct slot *slt;
|
||||
|
||||
for (slotno = 0; slotno < MAXSLOT; slotno++)
|
||||
if (pccard_slots[slotno] == 0)
|
||||
break;
|
||||
if (slotno == MAXSLOT)
|
||||
return(0);
|
||||
|
||||
MALLOC(slt, struct slot *, sizeof(*slt), M_DEVBUF, M_WAITOK | M_ZERO);
|
||||
make_dev(&crd_cdevsw, slotno, 0, 0, 0600, "card%d", slotno);
|
||||
slt = PCCARD_DEVICE2SOFTC(dev);
|
||||
slotno = device_get_unit(dev);
|
||||
slt->dev = dev;
|
||||
slt->d = make_dev(&crd_cdevsw, slotno, 0, 0, 0600, "card%d", slotno);
|
||||
slt->d->si_drv1 = slt;
|
||||
slt->ctrl = ctrl;
|
||||
slt->slotnum = slotno;
|
||||
pccard_slots[slotno] = slt;
|
||||
callout_handle_init(&slt->insert_ch);
|
||||
callout_handle_init(&slt->poff_ch);
|
||||
|
||||
return(slt);
|
||||
}
|
||||
|
||||
@ -326,12 +319,9 @@ pccard_event(struct slot *slt, enum card_event event)
|
||||
static int
|
||||
crdopen(dev_t dev, int oflags, int devtype, struct proc *p)
|
||||
{
|
||||
struct slot *slt;
|
||||
struct slot *slt = PCCARD_DEV2SOFTC(dev);
|
||||
|
||||
if (minor(dev) >= MAXSLOT)
|
||||
return(ENXIO);
|
||||
slt = pccard_slots[minor(dev)];
|
||||
if (slt == 0)
|
||||
if (slt == NULL)
|
||||
return(ENXIO);
|
||||
if (slt->rwmem == 0)
|
||||
slt->rwmem = MDF_ATTR;
|
||||
@ -355,7 +345,7 @@ crdclose(dev_t dev, int fflag, int devtype, struct proc *p)
|
||||
static int
|
||||
crdread(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
struct slot *slt = pccard_slots[minor(dev)];
|
||||
struct slot *slt = PCCARD_DEV2SOFTC(dev);
|
||||
struct mem_desc *mp, oldmap;
|
||||
unsigned char *p;
|
||||
unsigned int offs;
|
||||
@ -401,7 +391,7 @@ crdread(dev_t dev, struct uio *uio, int ioflag)
|
||||
static int
|
||||
crdwrite(dev_t dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
struct slot *slt = pccard_slots[minor(dev)];
|
||||
struct slot *slt = PCCARD_DEV2SOFTC(dev);
|
||||
struct mem_desc *mp, oldmap;
|
||||
unsigned char *p;
|
||||
unsigned int offs;
|
||||
@ -489,7 +479,7 @@ crdioctl_sresource(dev_t dev, caddr_t data)
|
||||
static int
|
||||
crdioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p)
|
||||
{
|
||||
struct slot *slt = pccard_slots[minor(dev)];
|
||||
struct slot *slt = PCCARD_DEV2SOFTC(dev);
|
||||
struct mem_desc *mp;
|
||||
struct io_desc *ip;
|
||||
device_t pcicdev;
|
||||
@ -662,9 +652,9 @@ crdioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p)
|
||||
static int
|
||||
crdpoll(dev_t dev, int events, struct proc *p)
|
||||
{
|
||||
int s;
|
||||
struct slot *slt = pccard_slots[minor(dev)];
|
||||
int revents = 0;
|
||||
int revents = 0;
|
||||
int s;
|
||||
struct slot *slt = PCCARD_DEV2SOFTC(dev);
|
||||
|
||||
if (events & (POLLIN | POLLRDNORM))
|
||||
revents |= events & (POLLIN | POLLRDNORM);
|
||||
@ -687,19 +677,13 @@ crdpoll(dev_t dev, int events, struct proc *p)
|
||||
return (revents);
|
||||
}
|
||||
|
||||
static struct slot *
|
||||
pccard_dev2slot(device_t dev)
|
||||
{
|
||||
return pccard_slots[device_get_unit(dev)];
|
||||
}
|
||||
|
||||
/*
|
||||
* APM hooks for suspending and resuming.
|
||||
*/
|
||||
int
|
||||
pccard_suspend(device_t dev)
|
||||
{
|
||||
struct slot *slt = pccard_dev2slot(dev);
|
||||
struct slot *slt = PCCARD_DEVICE2SOFTC(dev);
|
||||
|
||||
/* This code stolen from pccard_event:card_removed */
|
||||
if (slt->state == filled) {
|
||||
@ -722,7 +706,7 @@ pccard_suspend(device_t dev)
|
||||
int
|
||||
pccard_resume(device_t dev)
|
||||
{
|
||||
struct slot *slt = pccard_dev2slot(dev);
|
||||
struct slot *slt = PCCARD_DEVICE2SOFTC(dev);
|
||||
|
||||
if (pcic_resume_reset)
|
||||
slt->ctrl->resume(slt);
|
||||
|
@ -108,8 +108,14 @@ pccard_compat_do_attach(device_t bus, device_t dev)
|
||||
static int
|
||||
pccard_probe(device_t dev)
|
||||
{
|
||||
device_set_desc(dev, "PC Card bus -- kludge version");
|
||||
return 0;
|
||||
device_set_desc(dev, "PC Card bus (classic)");
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
pccard_attach(device_t dev)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -362,7 +368,7 @@ pccard_product_lookup(device_t dev, const struct pccard_product *tab,
|
||||
static device_method_t pccard_methods[] = {
|
||||
/* Device interface */
|
||||
DEVMETHOD(device_probe, pccard_probe),
|
||||
DEVMETHOD(device_attach, bus_generic_attach),
|
||||
DEVMETHOD(device_attach, pccard_attach),
|
||||
DEVMETHOD(device_shutdown, bus_generic_shutdown),
|
||||
DEVMETHOD(device_suspend, pccard_suspend),
|
||||
DEVMETHOD(device_resume, pccard_resume),
|
||||
@ -398,10 +404,10 @@ static device_method_t pccard_methods[] = {
|
||||
static driver_t pccard_driver = {
|
||||
"pccard",
|
||||
pccard_methods,
|
||||
1, /* no softc */
|
||||
sizeof(struct slot)
|
||||
};
|
||||
|
||||
DRIVER_MODULE(pccard, pcic, pccard_driver, pccard_devclass, 0, 0);
|
||||
DRIVER_MODULE(pccard, pc98pcic, pccard_driver, pccard_devclass, 0, 0);
|
||||
DRIVER_MODULE(pccard, cbb, pccard_driver, pccard_devclass, 0, 0);
|
||||
DRIVER_MODULE(pccard, mecia, pccard_driver, pccard_devclass, 0, 0);
|
||||
DRIVER_MODULE(pccard, tcic, pccard_driver, pccard_devclass, 0, 0);
|
||||
MODULE_VERSION(pccard, 1);
|
||||
|
@ -128,26 +128,23 @@ static char *bridges[] =
|
||||
"Vadem 469",
|
||||
"Ricoh RF5C396",
|
||||
"IBM KING PCMCIA Controller",
|
||||
"PC-98 Original"
|
||||
"PC-98 MECIA Controller"
|
||||
};
|
||||
|
||||
/*
|
||||
* Internal inline functions for accessing the PCIC.
|
||||
*/
|
||||
/*
|
||||
* Read a register from the PCIC.
|
||||
*/
|
||||
static __inline unsigned char
|
||||
static unsigned char
|
||||
getb1(struct pcic_slot *sp, int reg)
|
||||
{
|
||||
outb(sp->index, sp->offset + reg);
|
||||
return inb(sp->data);
|
||||
return (inb(sp->data));
|
||||
}
|
||||
|
||||
/*
|
||||
* Write a register on the PCIC
|
||||
*/
|
||||
static __inline void
|
||||
static void
|
||||
putb1(struct pcic_slot *sp, int reg, unsigned char val)
|
||||
{
|
||||
outb(sp->index, sp->offset + reg);
|
||||
@ -232,7 +229,7 @@ pcic_memory(struct slot *slt, int win)
|
||||
putw(sp, reg+2, 0);
|
||||
putw(sp, reg+4, 0);
|
||||
}
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -300,7 +297,7 @@ pcic_io(struct slot *slt, int win)
|
||||
putw(sp, reg, 0);
|
||||
putw(sp, reg + 2, 0);
|
||||
}
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -317,7 +314,6 @@ static int
|
||||
pcic_probe(device_t dev)
|
||||
{
|
||||
int slotnum, validslots = 0;
|
||||
struct slot *slt;
|
||||
struct pcic_slot *sp;
|
||||
unsigned char c;
|
||||
int error;
|
||||
@ -351,7 +347,7 @@ pcic_probe(device_t dev)
|
||||
if (!r) {
|
||||
if (bootverbose)
|
||||
device_printf(dev, "Cannot get I/O range\n");
|
||||
return ENOMEM;
|
||||
return (ENOMEM);
|
||||
}
|
||||
|
||||
sp = &pcic_slots[validunits * PCIC_CARD_SLOTS];
|
||||
@ -467,11 +463,7 @@ pcic_probe(device_t dev)
|
||||
*/
|
||||
validslots++;
|
||||
sp->slotnum = slotnum + validunits * PCIC_CARD_SLOTS;
|
||||
slt = pccard_alloc_slot(&cinfo);
|
||||
if (slt == 0)
|
||||
continue;
|
||||
slt->cdata = sp;
|
||||
sp->slt = slt;
|
||||
sp->slt = (struct slot *) 1;
|
||||
/*
|
||||
* Modem cards send the speaker audio (dialing noises)
|
||||
* to the host's speaker. Cirrus Logic PCIC chips must
|
||||
@ -506,14 +498,12 @@ pcic_probe(device_t dev)
|
||||
cinfo.maxio = 2; /* fake for UE2212 LAN card */
|
||||
#endif
|
||||
validslots++;
|
||||
slt = pccard_alloc_slot(&cinfo);
|
||||
slt->cdata = sp;
|
||||
sp->slt = slt;
|
||||
sp->slt = (struct slot *) 1;
|
||||
/* XXX need to allocated the port resources */
|
||||
device_set_desc(dev, "MECIA PC98 Original PCMCIA Controller");
|
||||
}
|
||||
#endif /* PC98 */
|
||||
return(validslots ? 0 : ENXIO);
|
||||
return (validslots ? 0 : ENXIO);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -527,28 +517,43 @@ do_mgt_irq(struct pcic_slot *sp, int irq)
|
||||
static int
|
||||
pcic_attach(device_t dev)
|
||||
{
|
||||
void *ih;
|
||||
int rid;
|
||||
int error;
|
||||
int irq;
|
||||
int i;
|
||||
void *ih;
|
||||
device_t kid;
|
||||
struct resource *r;
|
||||
int irq;
|
||||
int error;
|
||||
int rid;
|
||||
struct slot *slt;
|
||||
struct pcic_slot *sp;
|
||||
int i;
|
||||
int stat;
|
||||
int stat;
|
||||
|
||||
SET_UNIT(dev, validunits);
|
||||
sp = &pcic_slots[GET_UNIT(dev) * PCIC_CARD_SLOTS];
|
||||
for (i = 0; i < PCIC_CARD_SLOTS; i++, sp++) {
|
||||
if (sp->slt)
|
||||
device_add_child(dev, NULL, -1);
|
||||
if (!sp->slt)
|
||||
continue;
|
||||
sp->slt = 0;
|
||||
kid = device_add_child(dev, NULL, -1);
|
||||
if (kid == NULL) {
|
||||
device_printf(dev, "Can't add pccard bus slot %d", i);
|
||||
return (ENXIO);
|
||||
}
|
||||
device_probe_and_attach(kid);
|
||||
slt = pccard_init_slot(kid, &cinfo);
|
||||
if (slt == 0) {
|
||||
device_printf(dev, "Can't get pccard info slot %d", i);
|
||||
return (ENXIO);
|
||||
}
|
||||
slt->cdata = sp;
|
||||
sp->slt = slt;
|
||||
}
|
||||
validunits++;
|
||||
|
||||
rid = 0;
|
||||
r = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0, ~0, 1, RF_ACTIVE);
|
||||
if (!r) {
|
||||
return ENXIO;
|
||||
}
|
||||
if (!r)
|
||||
return (ENXIO);
|
||||
|
||||
irq = bus_get_resource_start(dev, SYS_RES_IRQ, 0);
|
||||
if (irq == 0) {
|
||||
@ -575,7 +580,7 @@ pcic_attach(device_t dev)
|
||||
pcicintr, (void *) GET_UNIT(dev), &ih);
|
||||
if (error) {
|
||||
bus_release_resource(dev, SYS_RES_IRQ, rid, r);
|
||||
return error;
|
||||
return (error);
|
||||
}
|
||||
irq = rman_get_start(r);
|
||||
device_printf(dev, "management irq %d\n", irq);
|
||||
@ -636,7 +641,7 @@ pcic_ioctl(struct slot *slt, int cmd, caddr_t data)
|
||||
|
||||
switch(cmd) {
|
||||
default:
|
||||
return(ENOTTY);
|
||||
return (ENOTTY);
|
||||
/*
|
||||
* Get/set PCIC registers
|
||||
*/
|
||||
@ -649,7 +654,7 @@ pcic_ioctl(struct slot *slt, int cmd, caddr_t data)
|
||||
((struct pcic_reg *)data)->value);
|
||||
break;
|
||||
}
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -675,7 +680,7 @@ pcic_power(struct slot *slt)
|
||||
case PCIC_I82365:
|
||||
switch(slt->pwr.vpp) {
|
||||
default:
|
||||
return(EINVAL);
|
||||
return (EINVAL);
|
||||
case 0:
|
||||
break;
|
||||
case 50:
|
||||
@ -688,7 +693,7 @@ pcic_power(struct slot *slt)
|
||||
}
|
||||
switch(slt->pwr.vcc) {
|
||||
default:
|
||||
return(EINVAL);
|
||||
return (EINVAL);
|
||||
case 0:
|
||||
break;
|
||||
case 33:
|
||||
@ -737,7 +742,7 @@ pcic_power(struct slot *slt)
|
||||
slt->pwr.vpp = 0;
|
||||
return (pcic_power(slt));
|
||||
}
|
||||
return(0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -911,7 +916,7 @@ pcic98_memory(struct slot *slt, int win)
|
||||
printf(
|
||||
"sys_addr must be 0xda000. requested address = %p\n",
|
||||
mp->start);
|
||||
return(EINVAL);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/* omajinai ??? */
|
||||
@ -953,7 +958,7 @@ pcic98_memory(struct slot *slt, int win)
|
||||
outw(PCIC98_REG_PAGOFS, reg_pagofs);
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -968,8 +973,8 @@ pcic98_io(struct slot *slt, int win)
|
||||
/* ignore for UE2212 */
|
||||
printf(
|
||||
"pcic98:Illegal PCIC I/O window(%d) request! Ignored.\n", win);
|
||||
/* return(EINVAL);*/
|
||||
return 0;
|
||||
/* return (EINVAL);*/
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (ip->flags & IODF_ACTIVE) {
|
||||
@ -1017,7 +1022,7 @@ pcic98_io(struct slot *slt, int win)
|
||||
outb(PCIC98_REG2, inb(PCIC98_REG2) & (~PCIC98_MAPIO));
|
||||
pcic98_mode = 0;
|
||||
}
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1028,7 +1033,7 @@ pcic98_power(struct slot *slt)
|
||||
reg = inb(PCIC98_REG7) & (~PCIC98_VPP12V);
|
||||
switch(slt->pwr.vpp) {
|
||||
default:
|
||||
return(EINVAL);
|
||||
return (EINVAL);
|
||||
case 50:
|
||||
break;
|
||||
case 120:
|
||||
@ -1041,7 +1046,7 @@ pcic98_power(struct slot *slt)
|
||||
reg = inb(PCIC98_REG2) & (~PCIC98_VCC3P3V);
|
||||
switch(slt->pwr.vcc) {
|
||||
default:
|
||||
return(EINVAL);
|
||||
return (EINVAL);
|
||||
case 33:
|
||||
reg |= PCIC98_VCC3P3V;
|
||||
break;
|
||||
@ -1050,7 +1055,7 @@ pcic98_power(struct slot *slt)
|
||||
}
|
||||
outb(PCIC98_REG2, reg);
|
||||
DELAY(100*1000);
|
||||
return 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1141,7 +1146,7 @@ pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
ip->size = rman_get_end(r) - rman_get_start(r) + 1;
|
||||
err = cinfo.mapio(devi->slt, rid);
|
||||
if (err)
|
||||
return err;
|
||||
return (err);
|
||||
break;
|
||||
}
|
||||
case SYS_RES_IRQ:
|
||||
@ -1154,21 +1159,21 @@ pcic_activate_resource(device_t dev, device_t child, int type, int rid,
|
||||
case SYS_RES_MEMORY: {
|
||||
struct mem_desc *mp;
|
||||
if (rid >= NUM_MEM_WINDOWS)
|
||||
return EINVAL;
|
||||
return (EINVAL);
|
||||
mp = &devi->slt->mem[rid];
|
||||
mp->flags |= MDF_ACTIVE;
|
||||
mp->start = (caddr_t) rman_get_start(r);
|
||||
mp->size = rman_get_end(r) - rman_get_start(r) + 1;
|
||||
err = cinfo.mapmem(devi->slt, rid);
|
||||
if (err)
|
||||
return err;
|
||||
return (err);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
err = bus_generic_activate_resource(dev, child, type, rid, r);
|
||||
return err;
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1183,9 +1188,8 @@ pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct io_desc *ip = &devi->slt->io[rid];
|
||||
ip->flags &= ~IODF_ACTIVE;
|
||||
err = cinfo.mapio(devi->slt, rid);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
if (err)
|
||||
return (err);
|
||||
break;
|
||||
}
|
||||
case SYS_RES_IRQ:
|
||||
@ -1194,16 +1198,15 @@ pcic_deactivate_resource(device_t dev, device_t child, int type, int rid,
|
||||
struct mem_desc *mp = &devi->slt->mem[rid];
|
||||
mp->flags &= ~(MDF_ACTIVE | MDF_ATTR);
|
||||
err = cinfo.mapmem(devi->slt, rid);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
if (err)
|
||||
return (err);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
err = bus_generic_deactivate_resource(dev, child, type, rid, r);
|
||||
return err;
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -120,11 +120,16 @@ struct slot {
|
||||
struct slot_ctrl *ctrl; /* Per-controller data */
|
||||
void *cdata; /* Controller specific data */
|
||||
int pwr_off_pending;/* Power status of slot */
|
||||
device_t dev; /* Config system device. */
|
||||
dev_t d; /* fs device */
|
||||
};
|
||||
|
||||
#define PCCARD_DEVICE2SOFTC(d) ((struct slot *) device_get_softc(d))
|
||||
#define PCCARD_DEV2SOFTC(d) ((struct slot *) (d)->si_drv1)
|
||||
|
||||
enum card_event { card_removed, card_inserted };
|
||||
|
||||
struct slot *pccard_alloc_slot(struct slot_ctrl *);
|
||||
struct slot *pccard_init_slot(device_t, struct slot_ctrl *);
|
||||
void pccard_event(struct slot *, enum card_event);
|
||||
int pccard_suspend(device_t);
|
||||
int pccard_resume(device_t);
|
||||
|
Loading…
Reference in New Issue
Block a user