Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: pcmcia: avoid buffer overflow in pcmcia_setup_isa_irq pcmcia: do not request windows if you don't need to pcmcia: insert PCMCIA device resources into resource tree pcmcia: export resource information to sysfs pcmcia: use struct resource for PCMCIA devices, part 2 pcmcia: remove memreq_t pcmcia: move local definitions out of include/pcmcia/cs.h pcmcia: do not use io_req_t when calling pcmcia_request_io() pcmcia: do not use io_req_t after call to pcmcia_request_io() pcmcia: use struct resource for PCMCIA devices pcmcia: clean up cs.h pcmcia: use pcmica_{read,write}_config_byte pcmcia: remove cs_types.h pcmcia: remove unused flag, simplify headers pcmcia: remove obsolete CS_EVENT_ definitions pcmcia: split up central event handler pcmcia: simplify event callback pcmcia: remove obsolete ioctl Conflicts in: - drivers/staging/comedi/drivers/* - drivers/staging/wlags49_h2/wl_cs.c due to dev_info_t and whitespace changes
This commit is contained in:
commit
1685e633b3
97 changed files with 1204 additions and 3202 deletions
|
@ -116,29 +116,6 @@ Who: Mauro Carvalho Chehab <mchehab@infradead.org>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl])
|
||||
When: 2.6.35/2.6.36
|
||||
Files: drivers/pcmcia/: pcmcia_ioctl.c
|
||||
Why: With the 16-bit PCMCIA subsystem now behaving (almost) like a
|
||||
normal hotpluggable bus, and with it using the default kernel
|
||||
infrastructure (hotplug, driver core, sysfs) keeping the PCMCIA
|
||||
control ioctl needed by cardmgr and cardctl from pcmcia-cs is
|
||||
unnecessary and potentially harmful (it does not provide for
|
||||
proper locking), and makes further cleanups and integration of the
|
||||
PCMCIA subsystem into the Linux kernel device driver model more
|
||||
difficult. The features provided by cardmgr and cardctl are either
|
||||
handled by the kernel itself now or are available in the new
|
||||
pcmciautils package available at
|
||||
http://kernel.org/pub/linux/utils/kernel/pcmcia/
|
||||
|
||||
For all architectures except ARM, the associated config symbol
|
||||
has been removed from kernel 2.6.34; for ARM, it will be likely
|
||||
be removed from kernel 2.6.35. The actual code will then likely
|
||||
be removed from kernel 2.6.36.
|
||||
Who: Dominik Brodowski <linux@dominikbrodowski.net>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: sys_sysctl
|
||||
When: September 2010
|
||||
Option: CONFIG_SYSCTL_SYSCALL
|
||||
|
|
|
@ -1,4 +1,16 @@
|
|||
This file details changes in 2.6 which affect PCMCIA card driver authors:
|
||||
* pcmcia_request_io changes (as of 2.6.36)
|
||||
Instead of io_req_t, drivers are now requested to fill out
|
||||
struct pcmcia_device *p_dev->resource[0,1] for up to two ioport
|
||||
ranges. After a call to pcmcia_request_io(), the ports found there
|
||||
are reserved, after calling pcmcia_request_configuration(), they may
|
||||
be used.
|
||||
|
||||
* No dev_info_t, no cs_types.h (as of 2.6.36)
|
||||
dev_info_t and a few other typedefs are removed. No longer use them
|
||||
in PCMCIA device drivers. Also, do not include pcmcia/cs_types.h, as
|
||||
this file is gone.
|
||||
|
||||
* No dev_node_t (as of 2.6.35)
|
||||
There is no more need to fill out a "dev_node_t" structure.
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <linux/ata.h>
|
||||
#include <linux/libata.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -201,23 +200,25 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
|
|||
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
pdev->io.BasePort1 = io->win[0].base;
|
||||
pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
pdev->resource[0]->start = io->win[0].base;
|
||||
if (!(io->flags & CISTPL_IO_16BIT)) {
|
||||
pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
}
|
||||
if (io->nwin == 2) {
|
||||
pdev->io.NumPorts1 = 8;
|
||||
pdev->io.BasePort2 = io->win[1].base;
|
||||
pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
|
||||
if (pcmcia_request_io(pdev, &pdev->io) != 0)
|
||||
pdev->resource[0]->end = 8;
|
||||
pdev->resource[1]->start = io->win[1].base;
|
||||
pdev->resource[1]->end = (stk->is_kme) ? 2 : 1;
|
||||
if (pcmcia_request_io(pdev) != 0)
|
||||
return -ENODEV;
|
||||
stk->ctl_base = pdev->io.BasePort2;
|
||||
stk->ctl_base = pdev->resource[1]->start;
|
||||
} else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
|
||||
pdev->io.NumPorts1 = io->win[0].len;
|
||||
pdev->io.NumPorts2 = 0;
|
||||
if (pcmcia_request_io(pdev, &pdev->io) != 0)
|
||||
pdev->resource[0]->end = io->win[0].len;
|
||||
pdev->resource[1]->end = 0;
|
||||
if (pcmcia_request_io(pdev) != 0)
|
||||
return -ENODEV;
|
||||
stk->ctl_base = pdev->io.BasePort1 + 0x0e;
|
||||
stk->ctl_base = pdev->resource[0]->start + 0x0e;
|
||||
} else
|
||||
return -ENODEV;
|
||||
/* If we've got this far, we're done */
|
||||
|
@ -246,9 +247,8 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
|||
struct ata_port_operations *ops = &pcmcia_port_ops;
|
||||
|
||||
/* Set up attributes in order to probe card and get resources */
|
||||
pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
pdev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
pdev->io.IOAddrLines = 3;
|
||||
pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
pdev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
pdev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
pdev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -271,7 +271,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
|||
if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk))
|
||||
goto failed; /* No suitable config found */
|
||||
}
|
||||
io_base = pdev->io.BasePort1;
|
||||
io_base = pdev->resource[0]->start;
|
||||
ctl_base = stk->ctl_base;
|
||||
if (!pdev->irq)
|
||||
goto failed;
|
||||
|
@ -294,7 +294,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
|||
|
||||
/* FIXME: Could be more ports at base + 0x10 but we only deal with
|
||||
one right now */
|
||||
if (pdev->io.NumPorts1 >= 0x20)
|
||||
if (resource_size(pdev->resource[0]) >= 0x20)
|
||||
n_ports = 2;
|
||||
|
||||
if (pdev->manf_id == 0x0097 && pdev->card_id == 0x1620)
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/skbuff.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -160,7 +159,7 @@ static void bluecard_detach(struct pcmcia_device *p_dev);
|
|||
static void bluecard_activity_led_timeout(u_long arg)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)arg;
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
|
||||
return;
|
||||
|
@ -177,7 +176,7 @@ static void bluecard_activity_led_timeout(u_long arg)
|
|||
|
||||
static void bluecard_enable_activity_led(bluecard_info_t *info)
|
||||
{
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (!test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
|
||||
return;
|
||||
|
@ -233,7 +232,7 @@ static void bluecard_write_wakeup(bluecard_info_t *info)
|
|||
}
|
||||
|
||||
do {
|
||||
register unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
register unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
register unsigned int offset;
|
||||
register unsigned char command;
|
||||
register unsigned long ready_bit;
|
||||
|
@ -380,7 +379,7 @@ static void bluecard_receive(bluecard_info_t *info, unsigned int offset)
|
|||
return;
|
||||
}
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (test_bit(XMIT_SENDING_READY, &(info->tx_state)))
|
||||
bluecard_enable_activity_led(info);
|
||||
|
@ -509,7 +508,7 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
|
|||
if (!test_bit(CARD_READY, &(info->hw_state)))
|
||||
return IRQ_HANDLED;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
spin_lock(&(info->lock));
|
||||
|
||||
|
@ -623,7 +622,7 @@ static int bluecard_hci_flush(struct hci_dev *hdev)
|
|||
static int bluecard_hci_open(struct hci_dev *hdev)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
|
||||
bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
|
||||
|
@ -643,7 +642,7 @@ static int bluecard_hci_open(struct hci_dev *hdev)
|
|||
static int bluecard_hci_close(struct hci_dev *hdev)
|
||||
{
|
||||
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data);
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
|
||||
return 0;
|
||||
|
@ -710,7 +709,7 @@ static int bluecard_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned l
|
|||
|
||||
static int bluecard_open(bluecard_info_t *info)
|
||||
{
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev;
|
||||
unsigned char id;
|
||||
|
||||
|
@ -829,7 +828,7 @@ static int bluecard_open(bluecard_info_t *info)
|
|||
|
||||
static int bluecard_close(bluecard_info_t *info)
|
||||
{
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev = info->hdev;
|
||||
|
||||
if (!hdev)
|
||||
|
@ -866,9 +865,6 @@ static int bluecard_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -891,12 +887,14 @@ static int bluecard_config(struct pcmcia_device *link)
|
|||
int i, n;
|
||||
|
||||
link->conf.ConfigIndex = 0x20;
|
||||
link->io.NumPorts1 = 64;
|
||||
link->io.IOAddrLines = 6;
|
||||
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 64;
|
||||
link->io_lines = 6;
|
||||
|
||||
for (n = 0; n < 0x400; n += 0x40) {
|
||||
link->io.BasePort1 = n ^ 0x300;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = n ^ 0x300;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -189,7 +188,7 @@ static void bt3c_write_wakeup(bt3c_info_t *info)
|
|||
return;
|
||||
|
||||
do {
|
||||
register unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
register unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
register struct sk_buff *skb;
|
||||
register int len;
|
||||
|
||||
|
@ -227,7 +226,7 @@ static void bt3c_receive(bt3c_info_t *info)
|
|||
return;
|
||||
}
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
avail = bt3c_read(iobase, 0x7006);
|
||||
//printk("bt3c_cs: receiving %d bytes\n", avail);
|
||||
|
@ -348,7 +347,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
|
|||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
spin_lock(&(info->lock));
|
||||
|
||||
|
@ -481,7 +480,7 @@ static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
|
|||
unsigned int iobase, size, addr, fcs, tmp;
|
||||
int i, err = 0;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
/* Reset */
|
||||
bt3c_io_write(iobase, 0x8040, 0x0404);
|
||||
|
@ -658,8 +657,8 @@ static int bt3c_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 8;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -684,14 +683,14 @@ static int bt3c_check_config(struct pcmcia_device *p_dev,
|
|||
{
|
||||
unsigned long try = (unsigned long) priv_data;
|
||||
|
||||
p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
|
||||
p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
|
||||
if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
|
||||
(cf->io.win[0].base != 0)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = (try == 0) ? 16 :
|
||||
cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -708,9 +707,9 @@ static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
|
|||
|
||||
if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
|
||||
for (j = 0; j < 5; j++) {
|
||||
p_dev->io.BasePort1 = base[j];
|
||||
p_dev->io.IOAddrLines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = base[j];
|
||||
p_dev->io_lines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -143,7 +142,7 @@ static void btuart_write_wakeup(btuart_info_t *info)
|
|||
}
|
||||
|
||||
do {
|
||||
register unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
register unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
register struct sk_buff *skb;
|
||||
register int len;
|
||||
|
||||
|
@ -184,7 +183,7 @@ static void btuart_receive(btuart_info_t *info)
|
|||
return;
|
||||
}
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
do {
|
||||
info->hdev->stat.byte_rx++;
|
||||
|
@ -298,7 +297,7 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst)
|
|||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
spin_lock(&(info->lock));
|
||||
|
||||
|
@ -355,7 +354,7 @@ static void btuart_change_speed(btuart_info_t *info, unsigned int speed)
|
|||
return;
|
||||
}
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
spin_lock_irqsave(&(info->lock), flags);
|
||||
|
||||
|
@ -479,7 +478,7 @@ static int btuart_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned lon
|
|||
static int btuart_open(btuart_info_t *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev;
|
||||
|
||||
spin_lock_init(&(info->lock));
|
||||
|
@ -549,7 +548,7 @@ static int btuart_open(btuart_info_t *info)
|
|||
static int btuart_close(btuart_info_t *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev = info->hdev;
|
||||
|
||||
if (!hdev)
|
||||
|
@ -587,8 +586,8 @@ static int btuart_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 8;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -613,14 +612,14 @@ static int btuart_check_config(struct pcmcia_device *p_dev,
|
|||
{
|
||||
int *try = priv_data;
|
||||
|
||||
p_dev->io_lines = (try == 0) ? 16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM))
|
||||
p_dev->conf.Vpp = cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
|
||||
if ((cf->io.nwin > 0) && (cf->io.win[0].len == 8) &&
|
||||
(cf->io.win[0].base != 0)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = (*try == 0) ? 16 :
|
||||
cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -637,9 +636,9 @@ static int btuart_check_config_notpicky(struct pcmcia_device *p_dev,
|
|||
|
||||
if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
|
||||
for (j = 0; j < 5; j++) {
|
||||
p_dev->io.BasePort1 = base[j];
|
||||
p_dev->io.IOAddrLines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = base[j];
|
||||
p_dev->io_lines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -150,7 +149,7 @@ static void dtl1_write_wakeup(dtl1_info_t *info)
|
|||
}
|
||||
|
||||
do {
|
||||
register unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
register unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
register struct sk_buff *skb;
|
||||
register int len;
|
||||
|
||||
|
@ -215,7 +214,7 @@ static void dtl1_receive(dtl1_info_t *info)
|
|||
return;
|
||||
}
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
do {
|
||||
info->hdev->stat.byte_rx++;
|
||||
|
@ -302,7 +301,7 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst)
|
|||
/* our irq handler is shared */
|
||||
return IRQ_NONE;
|
||||
|
||||
iobase = info->p_dev->io.BasePort1;
|
||||
iobase = info->p_dev->resource[0]->start;
|
||||
|
||||
spin_lock(&(info->lock));
|
||||
|
||||
|
@ -462,7 +461,7 @@ static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long
|
|||
static int dtl1_open(dtl1_info_t *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev;
|
||||
|
||||
spin_lock_init(&(info->lock));
|
||||
|
@ -509,7 +508,8 @@ static int dtl1_open(dtl1_info_t *info)
|
|||
outb(UART_LCR_WLEN8, iobase + UART_LCR); /* Reset DLAB */
|
||||
outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase + UART_MCR);
|
||||
|
||||
info->ri_latch = inb(info->p_dev->io.BasePort1 + UART_MSR) & UART_MSR_RI;
|
||||
info->ri_latch = inb(info->p_dev->resource[0]->start + UART_MSR)
|
||||
& UART_MSR_RI;
|
||||
|
||||
/* Turn on interrupts */
|
||||
outb(UART_IER_RLSI | UART_IER_RDI | UART_IER_THRI, iobase + UART_IER);
|
||||
|
@ -534,7 +534,7 @@ static int dtl1_open(dtl1_info_t *info)
|
|||
static int dtl1_close(dtl1_info_t *info)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int iobase = info->p_dev->io.BasePort1;
|
||||
unsigned int iobase = info->p_dev->resource[0]->start;
|
||||
struct hci_dev *hdev = info->hdev;
|
||||
|
||||
if (!hdev)
|
||||
|
@ -572,8 +572,8 @@ static int dtl1_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 8;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -597,14 +597,13 @@ static int dtl1_confcheck(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cf->io.win[0].len; /*yo */
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
if ((cf->io.nwin != 1) || (cf->io.win[0].len <= 8))
|
||||
return -ENODEV;
|
||||
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->end = cf->io.win[0].len; /*yo */
|
||||
p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int dtl1_config(struct pcmcia_device *link)
|
||||
|
@ -613,7 +612,7 @@ static int dtl1_config(struct pcmcia_device *link)
|
|||
int i;
|
||||
|
||||
/* Look for a generic full-sized window */
|
||||
link->io.NumPorts1 = 8;
|
||||
link->resource[0]->end = 8;
|
||||
if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0)
|
||||
goto failed;
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <linux/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -422,7 +421,7 @@ static struct card_fixup card_fixups[] = {
|
|||
static void set_cardparameter(struct cm4000_dev *dev)
|
||||
{
|
||||
int i;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
u_int8_t stopbits = 0x02; /* ISO default */
|
||||
|
||||
DEBUGP(3, dev, "-> set_cardparameter\n");
|
||||
|
@ -455,7 +454,7 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
|
|||
unsigned short num_bytes_read;
|
||||
unsigned char pts_reply[4];
|
||||
ssize_t rc;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
|
||||
rc = 0;
|
||||
|
||||
|
@ -664,7 +663,7 @@ static void terminate_monitor(struct cm4000_dev *dev)
|
|||
static void monitor_card(unsigned long p)
|
||||
{
|
||||
struct cm4000_dev *dev = (struct cm4000_dev *) p;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
unsigned short s;
|
||||
struct ptsreq ptsreq;
|
||||
int i, atrc;
|
||||
|
@ -925,7 +924,7 @@ static ssize_t cmm_read(struct file *filp, __user char *buf, size_t count,
|
|||
loff_t *ppos)
|
||||
{
|
||||
struct cm4000_dev *dev = filp->private_data;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
ssize_t rc;
|
||||
int i, j, k;
|
||||
|
||||
|
@ -1048,7 +1047,7 @@ static ssize_t cmm_write(struct file *filp, const char __user *buf,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct cm4000_dev *dev = filp->private_data;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
unsigned short s;
|
||||
unsigned char tmp;
|
||||
unsigned char infolen;
|
||||
|
@ -1401,7 +1400,7 @@ static void stop_monitor(struct cm4000_dev *dev)
|
|||
static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct cm4000_dev *dev = filp->private_data;
|
||||
unsigned int iobase = dev->p_dev->io.BasePort1;
|
||||
unsigned int iobase = dev->p_dev->resource[0]->start;
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct pcmcia_device *link;
|
||||
int size;
|
||||
|
@ -1752,17 +1751,12 @@ static int cm4000_config_check(struct pcmcia_device *p_dev,
|
|||
if (!cfg->io.nwin)
|
||||
return -ENODEV;
|
||||
|
||||
/* Get the IOaddr */
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(cfg->io.flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(cfg->io.flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
|
||||
p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int cm4000_config(struct pcmcia_device * link, int devno)
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -110,7 +109,7 @@ static inline unsigned char xinb(unsigned short port)
|
|||
static void cm4040_do_poll(unsigned long dummy)
|
||||
{
|
||||
struct reader_dev *dev = (struct reader_dev *) dummy;
|
||||
unsigned int obs = xinb(dev->p_dev->io.BasePort1
|
||||
unsigned int obs = xinb(dev->p_dev->resource[0]->start
|
||||
+ REG_OFFSET_BUFFER_STATUS);
|
||||
|
||||
if ((obs & BSR_BULK_IN_FULL)) {
|
||||
|
@ -141,7 +140,7 @@ static void cm4040_stop_poll(struct reader_dev *dev)
|
|||
static int wait_for_bulk_out_ready(struct reader_dev *dev)
|
||||
{
|
||||
int i, rc;
|
||||
int iobase = dev->p_dev->io.BasePort1;
|
||||
int iobase = dev->p_dev->resource[0]->start;
|
||||
|
||||
for (i = 0; i < POLL_LOOP_COUNT; i++) {
|
||||
if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
|
||||
|
@ -171,7 +170,7 @@ static int wait_for_bulk_out_ready(struct reader_dev *dev)
|
|||
/* Write to Sync Control Register */
|
||||
static int write_sync_reg(unsigned char val, struct reader_dev *dev)
|
||||
{
|
||||
int iobase = dev->p_dev->io.BasePort1;
|
||||
int iobase = dev->p_dev->resource[0]->start;
|
||||
int rc;
|
||||
|
||||
rc = wait_for_bulk_out_ready(dev);
|
||||
|
@ -189,7 +188,7 @@ static int write_sync_reg(unsigned char val, struct reader_dev *dev)
|
|||
static int wait_for_bulk_in_ready(struct reader_dev *dev)
|
||||
{
|
||||
int i, rc;
|
||||
int iobase = dev->p_dev->io.BasePort1;
|
||||
int iobase = dev->p_dev->resource[0]->start;
|
||||
|
||||
for (i = 0; i < POLL_LOOP_COUNT; i++) {
|
||||
if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)
|
||||
|
@ -219,7 +218,7 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct reader_dev *dev = filp->private_data;
|
||||
int iobase = dev->p_dev->io.BasePort1;
|
||||
int iobase = dev->p_dev->resource[0]->start;
|
||||
size_t bytes_to_read;
|
||||
unsigned long i;
|
||||
size_t min_bytes_to_read;
|
||||
|
@ -321,7 +320,7 @@ static ssize_t cm4040_write(struct file *filp, const char __user *buf,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct reader_dev *dev = filp->private_data;
|
||||
int iobase = dev->p_dev->io.BasePort1;
|
||||
int iobase = dev->p_dev->resource[0]->start;
|
||||
ssize_t rc;
|
||||
int i;
|
||||
unsigned int bytes_to_write;
|
||||
|
@ -528,16 +527,12 @@ static int cm4040_config_check(struct pcmcia_device *p_dev,
|
|||
return -ENODEV;
|
||||
|
||||
/* Get the IOaddr */
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(cfg->io.flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(cfg->io.flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
|
||||
p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
rc = pcmcia_request_io(p_dev);
|
||||
|
||||
rc = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
dev_printk(KERN_INFO, &p_dev->dev,
|
||||
"pcmcia_request_io returned 0x%x\n", rc);
|
||||
return rc;
|
||||
|
@ -549,10 +544,6 @@ static int reader_config(struct pcmcia_device *link, int devno)
|
|||
struct reader_dev *dev;
|
||||
int fail_rc;
|
||||
|
||||
link->io.BasePort2 = 0;
|
||||
link->io.NumPorts2 = 0;
|
||||
link->io.Attributes2 = 0;
|
||||
|
||||
if (pcmcia_loop_config(link, cm4040_config_check, NULL))
|
||||
goto cs_release;
|
||||
|
||||
|
@ -568,8 +559,8 @@ static int reader_config(struct pcmcia_device *link, int devno)
|
|||
|
||||
dev = link->priv;
|
||||
|
||||
DEBUGP(2, dev, "device " DEVICE_NAME "%d at 0x%.4x-0x%.4x\n", devno,
|
||||
link->io.BasePort1, link->io.BasePort1+link->io.NumPorts1);
|
||||
DEBUGP(2, dev, "device " DEVICE_NAME "%d at %pR\n", devno,
|
||||
link->resource[0]);
|
||||
DEBUGP(2, dev, "<- reader_config (succ)\n");
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -84,23 +84,22 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
|
|||
{
|
||||
struct ipw_dev *ipw = priv_data;
|
||||
struct resource *io_resource;
|
||||
memreq_t memreq_attr_memory;
|
||||
memreq_t memreq_common_memory;
|
||||
int ret;
|
||||
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io.IOAddrLines = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
|
||||
/* 0x40 causes it to generate level mode interrupts. */
|
||||
/* 0x04 enables IREQ pin. */
|
||||
p_dev->conf.ConfigIndex = cfg->index | 0x44;
|
||||
ret = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->io_lines = 16;
|
||||
ret = pcmcia_request_io(p_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
io_resource = request_region(p_dev->io.BasePort1, p_dev->io.NumPorts1,
|
||||
io_resource = request_region(p_dev->resource[0]->start,
|
||||
resource_size(p_dev->resource[0]),
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
|
||||
if (cfg->mem.nwin == 0)
|
||||
|
@ -120,11 +119,8 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
|
|||
if (ret != 0)
|
||||
goto exit1;
|
||||
|
||||
memreq_common_memory.CardOffset = cfg->mem.win[0].card_addr;
|
||||
memreq_common_memory.Page = 0;
|
||||
|
||||
ret = pcmcia_map_mem_page(p_dev, ipw->handle_common_memory,
|
||||
&memreq_common_memory);
|
||||
cfg->mem.win[0].card_addr);
|
||||
|
||||
if (ret != 0)
|
||||
goto exit2;
|
||||
|
@ -149,12 +145,7 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
|
|||
if (ret != 0)
|
||||
goto exit2;
|
||||
|
||||
memreq_attr_memory.CardOffset = 0;
|
||||
memreq_attr_memory.Page = 0;
|
||||
|
||||
ret = pcmcia_map_mem_page(p_dev, ipw->handle_attr_memory,
|
||||
&memreq_attr_memory);
|
||||
|
||||
ret = pcmcia_map_mem_page(p_dev, ipw->handle_attr_memory, 0);
|
||||
if (ret != 0)
|
||||
goto exit3;
|
||||
|
||||
|
@ -166,15 +157,12 @@ static int ipwireless_probe(struct pcmcia_device *p_dev,
|
|||
return 0;
|
||||
|
||||
exit3:
|
||||
pcmcia_release_window(p_dev, ipw->handle_attr_memory);
|
||||
exit2:
|
||||
if (ipw->common_memory) {
|
||||
release_mem_region(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size);
|
||||
iounmap(ipw->common_memory);
|
||||
pcmcia_release_window(p_dev, ipw->handle_common_memory);
|
||||
} else
|
||||
pcmcia_release_window(p_dev, ipw->handle_common_memory);
|
||||
}
|
||||
exit1:
|
||||
release_resource(io_resource);
|
||||
pcmcia_disable_device(p_dev);
|
||||
|
@ -197,7 +185,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
|||
|
||||
INIT_WORK(&ipw->work_reboot, signalled_reboot_work);
|
||||
|
||||
ipwireless_init_hardware_v1(ipw->hardware, link->io.BasePort1,
|
||||
ipwireless_init_hardware_v1(ipw->hardware, link->resource[0]->start,
|
||||
ipw->attr_memory, ipw->common_memory,
|
||||
ipw->is_v2_card, signalled_reboot_callback,
|
||||
ipw);
|
||||
|
@ -209,10 +197,7 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
|||
printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": Card type %s\n",
|
||||
ipw->is_v2_card ? "V2/V3" : "V1");
|
||||
printk(KERN_INFO IPWIRELESS_PCCARD_NAME
|
||||
": I/O ports 0x%04x-0x%04x, irq %d\n",
|
||||
(unsigned int) link->io.BasePort1,
|
||||
(unsigned int) (link->io.BasePort1 +
|
||||
link->io.NumPorts1 - 1),
|
||||
": I/O ports %pR, irq %d\n", link->resource[0],
|
||||
(unsigned int) link->irq);
|
||||
if (ipw->attr_memory && ipw->common_memory)
|
||||
printk(KERN_INFO IPWIRELESS_PCCARD_NAME
|
||||
|
@ -250,13 +235,12 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
|||
release_mem_region(ipw->request_attr_memory.Base,
|
||||
ipw->request_attr_memory.Size);
|
||||
iounmap(ipw->attr_memory);
|
||||
pcmcia_release_window(link, ipw->handle_attr_memory);
|
||||
|
||||
}
|
||||
if (ipw->common_memory) {
|
||||
release_mem_region(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size);
|
||||
iounmap(ipw->common_memory);
|
||||
pcmcia_release_window(link, ipw->handle_common_memory);
|
||||
}
|
||||
pcmcia_disable_device(link);
|
||||
return -1;
|
||||
|
@ -274,11 +258,6 @@ static void release_ipwireless(struct ipw_dev *ipw)
|
|||
ipw->request_attr_memory.Size);
|
||||
iounmap(ipw->attr_memory);
|
||||
}
|
||||
if (ipw->common_memory)
|
||||
pcmcia_release_window(ipw->link, ipw->handle_common_memory);
|
||||
if (ipw->attr_memory)
|
||||
pcmcia_release_window(ipw->link, ipw->handle_attr_memory);
|
||||
|
||||
pcmcia_disable_device(ipw->link);
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -70,7 +70,6 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/hdlc.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -572,18 +571,15 @@ static int mgslpc_ioprobe(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
if (cfg->io.nwin > 0) {
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(cfg->io.flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(cfg->io.flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
}
|
||||
return -ENODEV;
|
||||
if (!cfg->io.nwin)
|
||||
return -ENODEV;
|
||||
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
p_dev->resource[0]->flags |= pcmcia_io_cfg_data_width(cfg->io.flags);
|
||||
p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int mgslpc_config(struct pcmcia_device *link)
|
||||
|
@ -610,16 +606,15 @@ static int mgslpc_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
info->io_base = link->io.BasePort1;
|
||||
info->io_base = link->resource[0]->start;
|
||||
info->irq_level = link->irq;
|
||||
|
||||
dev_info(&link->dev, "index 0x%02x:",
|
||||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->resource[0])
|
||||
printk(", io %pR", link->resource[0]);
|
||||
printk("\n");
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -98,9 +97,8 @@ static int ide_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.IOAddrLines = 3;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -229,24 +227,27 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
|
|||
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
pdev->conf.ConfigIndex = cfg->index;
|
||||
pdev->io.BasePort1 = io->win[0].base;
|
||||
pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
pdev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
pdev->resource[0]->start = io->win[0].base;
|
||||
if (!(io->flags & CISTPL_IO_16BIT)) {
|
||||
pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
}
|
||||
if (io->nwin == 2) {
|
||||
pdev->io.NumPorts1 = 8;
|
||||
pdev->io.BasePort2 = io->win[1].base;
|
||||
pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
|
||||
if (pcmcia_request_io(pdev, &pdev->io) != 0)
|
||||
pdev->resource[0]->end = 8;
|
||||
pdev->resource[1]->start = io->win[1].base;
|
||||
pdev->resource[1]->end = (stk->is_kme) ? 2 : 1;
|
||||
if (pcmcia_request_io(pdev) != 0)
|
||||
return -ENODEV;
|
||||
stk->ctl_base = pdev->io.BasePort2;
|
||||
stk->ctl_base = pdev->resource[1]->start;
|
||||
} else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
|
||||
pdev->io.NumPorts1 = io->win[0].len;
|
||||
pdev->io.NumPorts2 = 0;
|
||||
if (pcmcia_request_io(pdev, &pdev->io) != 0)
|
||||
pdev->resource[0]->end = io->win[0].len;
|
||||
pdev->resource[1]->end = 0;
|
||||
if (pcmcia_request_io(pdev) != 0)
|
||||
return -ENODEV;
|
||||
stk->ctl_base = pdev->io.BasePort1 + 0x0e;
|
||||
stk->ctl_base = pdev->resource[0]->start + 0x0e;
|
||||
} else
|
||||
return -ENODEV;
|
||||
/* If we've got this far, we're done */
|
||||
|
@ -280,7 +281,7 @@ static int ide_config(struct pcmcia_device *link)
|
|||
if (pcmcia_loop_config(link, pcmcia_check_one_config, stk))
|
||||
goto failed; /* No suitable config found */
|
||||
}
|
||||
io_base = link->io.BasePort1;
|
||||
io_base = link->resource[0]->start;
|
||||
ctl_base = stk->ctl_base;
|
||||
|
||||
if (!link->irq)
|
||||
|
@ -297,7 +298,7 @@ static int ide_config(struct pcmcia_device *link)
|
|||
outb(0x81, ctl_base+1);
|
||||
|
||||
host = idecs_register(io_base, ctl_base, link->irq, link);
|
||||
if (host == NULL && link->io.NumPorts1 == 0x20) {
|
||||
if (host == NULL && resource_size(link->resource[0]) == 0x20) {
|
||||
outb(0x02, ctl_base + 0x10);
|
||||
host = idecs_register(io_base + 0x10, ctl_base + 0x10,
|
||||
link->irq, link);
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -76,9 +75,8 @@ static int avmcs_probe(struct pcmcia_device *p_dev)
|
|||
{
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -120,13 +118,9 @@ static int avmcs_configcheck(struct pcmcia_device *p_dev,
|
|||
if (cf->io.nwin <= 0)
|
||||
return -ENODEV;
|
||||
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cf->io.win[0].len;
|
||||
p_dev->io.NumPorts2 = 0;
|
||||
printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n",
|
||||
p_dev->io.BasePort1,
|
||||
p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->end = cf->io.win[0].len;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int avmcs_config(struct pcmcia_device *link)
|
||||
|
@ -192,9 +186,10 @@ static int avmcs_config(struct pcmcia_device *link)
|
|||
default:
|
||||
case AVM_CARDTYPE_B1: addcard = b1pcmcia_addcard_b1; break;
|
||||
}
|
||||
if ((i = (*addcard)(link->io.BasePort1, link->irq)) < 0) {
|
||||
dev_err(&link->dev, "avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
|
||||
link->io.BasePort1, link->irq);
|
||||
if ((i = (*addcard)(link->resource[0]->start, link->irq)) < 0) {
|
||||
dev_err(&link->dev,
|
||||
"avm_cs: failed to add AVM-Controller at i/o %#x, irq %d\n",
|
||||
(unsigned int) link->resource[0]->start, link->irq);
|
||||
avmcs_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -212,7 +207,7 @@ static int avmcs_config(struct pcmcia_device *link)
|
|||
|
||||
static void avmcs_release(struct pcmcia_device *link)
|
||||
{
|
||||
b1pcmcia_delcard(link->io.BasePort1, link->irq);
|
||||
b1pcmcia_delcard(link->resource[0]->start, link->irq);
|
||||
pcmcia_disable_device(link);
|
||||
} /* avmcs_release */
|
||||
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -79,11 +78,10 @@ static int __devinit avma1cs_probe(struct pcmcia_device *p_dev)
|
|||
dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.NumPorts2 = 16;
|
||||
p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
|
||||
p_dev->io.IOAddrLines = 5;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->resource[1]->end = 16;
|
||||
p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -127,13 +125,10 @@ static int avma1cs_configcheck(struct pcmcia_device *p_dev,
|
|||
if (cf->io.nwin <= 0)
|
||||
return -ENODEV;
|
||||
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cf->io.win[0].len;
|
||||
p_dev->io.NumPorts2 = 0;
|
||||
printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n",
|
||||
p_dev->io.BasePort1,
|
||||
p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->end = cf->io.win[0].len;
|
||||
p_dev->io_lines = 5;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
|
||||
|
@ -181,16 +176,18 @@ static int __devinit avma1cs_config(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
printk(KERN_NOTICE "avma1_cs: checking at i/o %#x, irq %d\n",
|
||||
link->io.BasePort1, link->irq);
|
||||
(unsigned int) link->resource[0]->start, link->irq);
|
||||
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.para[1] = link->resource[0]->start;
|
||||
icard.protocol = isdnprot;
|
||||
icard.typ = ISDN_CTYPE_A1_PCMCIA;
|
||||
|
||||
i = hisax_init_pcmcia(link, &busy, &icard);
|
||||
if (i < 0) {
|
||||
printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 PCMCIA %d at i/o %#x\n", i, link->io.BasePort1);
|
||||
printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 "
|
||||
"PCMCIA %d at i/o %#x\n", i,
|
||||
(unsigned int) link->resource[0]->start);
|
||||
avma1cs_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -127,9 +126,8 @@ static int __devinit elsa_cs_probe(struct pcmcia_device *link)
|
|||
and attributes of IO windows) are fixed by the nature of the
|
||||
device, and can be hard-wired here.
|
||||
*/
|
||||
link->io.NumPorts1 = 8;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 3;
|
||||
link->resource[0]->end = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -174,16 +172,18 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
|
|||
{
|
||||
int j;
|
||||
|
||||
p_dev->io_lines = 3;
|
||||
|
||||
if ((cf->io.nwin > 0) && cf->io.win[0].base) {
|
||||
printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
} else {
|
||||
printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n");
|
||||
for (j = 0x2f0; j > 0x100; j -= 0x10) {
|
||||
p_dev->io.BasePort1 = j;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = j;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -215,23 +215,21 @@ static int __devinit elsa_cs_config(struct pcmcia_device *link)
|
|||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.para[1] = link->resource[0]->start;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_ELSA_PCMCIA;
|
||||
|
||||
i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
|
||||
if (i < 0) {
|
||||
printk(KERN_ERR "elsa_cs: failed to initialize Elsa PCMCIA %d at i/o %#x\n",
|
||||
i, link->io.BasePort1);
|
||||
printk(KERN_ERR "elsa_cs: failed to initialize Elsa "
|
||||
"PCMCIA %d with %pR\n", i, link->resource[0]);
|
||||
elsa_cs_release(link);
|
||||
} else
|
||||
((local_info_t*)link->priv)->cardnr = i;
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -130,9 +129,8 @@ static int __devinit sedlbauer_probe(struct pcmcia_device *link)
|
|||
/* from old sedl_cs
|
||||
*/
|
||||
/* The io structure describes IO port mapping */
|
||||
link->io.NumPorts1 = 8;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.IOAddrLines = 3;
|
||||
link->resource[0]->end = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
link->conf.Attributes = 0;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -173,8 +171,6 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
win_req_t *req = priv_data;
|
||||
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -202,52 +198,25 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
p_dev->io_lines = 3;
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
Now set up a common memory window, if needed. There is room
|
||||
in the struct pcmcia_device structure for one memory window handle,
|
||||
but if the base addresses need to be saved, or if multiple
|
||||
windows are needed, the info should go in the private data
|
||||
structure for this device.
|
||||
|
||||
Note that the memory window base is a physical address, and
|
||||
needs to be mapped to virtual space with ioremap() before it
|
||||
is used.
|
||||
*/
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
memreq_t map;
|
||||
req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
req->Base = mem->win[0].host_addr;
|
||||
req->Size = mem->win[0].len;
|
||||
req->AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, req, &p_dev->win) != 0)
|
||||
return -ENODEV;
|
||||
map.Page = 0;
|
||||
map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -255,16 +224,11 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
|
|||
|
||||
static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
||||
{
|
||||
win_req_t *req;
|
||||
int ret;
|
||||
IsdnCard_t icard;
|
||||
|
||||
dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
|
||||
|
||||
req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
|
||||
if (!req)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
In this loop, we scan the CIS for configuration table entries,
|
||||
each of which describes a valid card configuration, including
|
||||
|
@ -277,7 +241,7 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
|||
these things without consulting the CIS, and most client drivers
|
||||
will only use the CIS to fill in implementation-defined details.
|
||||
*/
|
||||
ret = pcmcia_loop_config(link, sedlbauer_config_check, req);
|
||||
ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
@ -297,27 +261,22 @@ static int __devinit sedlbauer_config(struct pcmcia_device *link)
|
|||
printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", req->Base,
|
||||
req->Base+req->Size-1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.para[1] = link->resource[0]->start;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
|
||||
|
||||
ret = hisax_init_pcmcia(link,
|
||||
&(((local_info_t *)link->priv)->stop), &icard);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d at i/o %#x\n",
|
||||
ret, link->io.BasePort1);
|
||||
printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n",
|
||||
ret, link->resource[0]);
|
||||
sedlbauer_release(link);
|
||||
return -ENODEV;
|
||||
} else
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -107,9 +106,8 @@ static int __devinit teles_probe(struct pcmcia_device *link)
|
|||
and attributes of IO windows) are fixed by the nature of the
|
||||
device, and can be hard-wired here.
|
||||
*/
|
||||
link->io.NumPorts1 = 96;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 5;
|
||||
link->resource[0]->end = 96;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -154,16 +152,18 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev,
|
|||
{
|
||||
int j;
|
||||
|
||||
p_dev->io_lines = 5;
|
||||
|
||||
if ((cf->io.nwin > 0) && cf->io.win[0].base) {
|
||||
printk(KERN_INFO "(teles_cs: looks like the 96 model)\n");
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
} else {
|
||||
printk(KERN_INFO "(teles_cs: looks like the 97 model)\n");
|
||||
for (j = 0x2f0; j > 0x100; j -= 0x10) {
|
||||
p_dev->io.BasePort1 = j;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = j;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -195,23 +195,21 @@ static int __devinit teles_cs_config(struct pcmcia_device *link)
|
|||
link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
icard.para[0] = link->irq;
|
||||
icard.para[1] = link->io.BasePort1;
|
||||
icard.para[1] = link->resource[0]->start;
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_TELESPCMCIA;
|
||||
|
||||
i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard);
|
||||
if (i < 0) {
|
||||
printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n",
|
||||
i, link->io.BasePort1);
|
||||
i, (unsigned int) link->resource[0]->start);
|
||||
teles_cs_release(link);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -103,7 +102,7 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
|
|||
{
|
||||
struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1;
|
||||
window_handle_t win = (window_handle_t)map->map_priv_2;
|
||||
memreq_t mrq;
|
||||
unsigned int offset;
|
||||
int ret;
|
||||
|
||||
if (!pcmcia_dev_present(dev->p_dev)) {
|
||||
|
@ -111,15 +110,14 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
|
|||
return 0;
|
||||
}
|
||||
|
||||
mrq.CardOffset = to & ~(dev->win_size-1);
|
||||
if(mrq.CardOffset != dev->offset) {
|
||||
offset = to & ~(dev->win_size-1);
|
||||
if (offset != dev->offset) {
|
||||
DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",
|
||||
dev->offset, mrq.CardOffset);
|
||||
mrq.Page = 0;
|
||||
ret = pcmcia_map_mem_page(dev->p_dev, win, &mrq);
|
||||
dev->offset, offset);
|
||||
ret = pcmcia_map_mem_page(dev->p_dev, win, offset);
|
||||
if (ret != 0)
|
||||
return NULL;
|
||||
dev->offset = mrq.CardOffset;
|
||||
dev->offset = offset;
|
||||
}
|
||||
return dev->win_base + (to & (dev->win_size-1));
|
||||
}
|
||||
|
@ -346,7 +344,6 @@ static void pcmciamtd_release(struct pcmcia_device *link)
|
|||
iounmap(dev->win_base);
|
||||
dev->win_base = NULL;
|
||||
}
|
||||
pcmcia_release_window(link, link->win);
|
||||
}
|
||||
pcmcia_disable_device(link);
|
||||
}
|
||||
|
|
|
@ -87,7 +87,6 @@ earlier 3Com products.
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/mii.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -279,8 +278,8 @@ static int tc574_probe(struct pcmcia_device *link)
|
|||
lp->p_dev = link;
|
||||
|
||||
spin_lock_init(&lp->window_lock);
|
||||
link->io.NumPorts1 = 32;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->end = 32;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 1;
|
||||
|
@ -338,10 +337,11 @@ static int tc574_config(struct pcmcia_device *link)
|
|||
|
||||
dev_dbg(&link->dev, "3c574_config()\n");
|
||||
|
||||
link->io.IOAddrLines = 16;
|
||||
link->io_lines = 16;
|
||||
|
||||
for (i = j = 0; j < 0x400; j += 0x20) {
|
||||
link->io.BasePort1 = j ^ 0x300;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = j ^ 0x300;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
|
@ -357,7 +357,7 @@ static int tc574_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -214,8 +213,8 @@ static int tc589_probe(struct pcmcia_device *link)
|
|||
lp->p_dev = link;
|
||||
|
||||
spin_lock_init(&lp->lock);
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->end = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -278,12 +277,13 @@ static int tc589_config(struct pcmcia_device *link)
|
|||
"3Com card??\n");
|
||||
multi = (link->card_id == PRODID_3COM_3C562);
|
||||
|
||||
link->io_lines = 16;
|
||||
|
||||
/* For the 3c562, the base address must be xx00-xx7f */
|
||||
link->io.IOAddrLines = 16;
|
||||
for (i = j = 0; j < 0x400; j += 0x10) {
|
||||
if (multi && (j & 0x80)) continue;
|
||||
link->io.BasePort1 = j ^ 0x300;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = j ^ 0x300;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
|
@ -299,7 +299,7 @@ static int tc589_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
ioaddr = dev->base_addr;
|
||||
EL3WINDOW(0);
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include <linux/mii.h>
|
||||
#include "../8390.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -260,28 +259,30 @@ static int get_prom(struct pcmcia_device *link)
|
|||
static int try_io_port(struct pcmcia_device *link)
|
||||
{
|
||||
int j, ret;
|
||||
if (link->io.NumPorts1 == 32) {
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
if (link->resource[0]->end == 32) {
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
/* for master/slave multifunction cards */
|
||||
if (link->io.NumPorts2 > 0)
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
if (link->resource[1]->end > 0)
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
} else {
|
||||
/* This should be two 16-port windows */
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
}
|
||||
if (link->io.BasePort1 == 0) {
|
||||
link->io.IOAddrLines = 16;
|
||||
if (link->resource[0]->start == 0) {
|
||||
for (j = 0; j < 0x400; j += 0x20) {
|
||||
link->io.BasePort1 = j ^ 0x300;
|
||||
link->io.BasePort2 = (j ^ 0x300) + 0x10;
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = j ^ 0x300;
|
||||
link->resource[1]->start = (j ^ 0x300) + 0x10;
|
||||
link->io_lines = 16;
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
return pcmcia_request_io(link, &link->io);
|
||||
return pcmcia_request_io(link);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,15 +303,15 @@ static int axnet_configcheck(struct pcmcia_device *p_dev,
|
|||
network function with window 0, and serial with window 1 */
|
||||
if (io->nwin > 1) {
|
||||
i = (io->win[1].len > io->win[0].len);
|
||||
p_dev->io.BasePort2 = io->win[1-i].base;
|
||||
p_dev->io.NumPorts2 = io->win[1-i].len;
|
||||
p_dev->resource[1]->start = io->win[1-i].base;
|
||||
p_dev->resource[1]->end = io->win[1-i].len;
|
||||
} else {
|
||||
i = p_dev->io.NumPorts2 = 0;
|
||||
i = p_dev->resource[1]->end = 0;
|
||||
}
|
||||
p_dev->io.BasePort1 = io->win[i].base;
|
||||
p_dev->io.NumPorts1 = io->win[i].len;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32)
|
||||
p_dev->resource[0]->start = io->win[i].base;
|
||||
p_dev->resource[0]->end = io->win[i].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
|
||||
return try_io_port(p_dev);
|
||||
|
||||
return -ENODEV;
|
||||
|
@ -333,7 +334,7 @@ static int axnet_config(struct pcmcia_device *link)
|
|||
if (!link->irq)
|
||||
goto failed;
|
||||
|
||||
if (link->io.NumPorts2 == 8) {
|
||||
if (resource_size(link->resource[1]) == 8) {
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status = CCSR_AUDIO_ENA;
|
||||
}
|
||||
|
@ -343,7 +344,7 @@ static int axnet_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
if (!get_prom(link)) {
|
||||
printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
|
||||
|
@ -379,8 +380,7 @@ static int axnet_config(struct pcmcia_device *link)
|
|||
/* Maybe PHY is in power down mode. (PPD_SET = 1)
|
||||
Bit 2 of CCSR is active low. */
|
||||
if (i == 32) {
|
||||
conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
|
||||
pcmcia_access_configuration_register(link, ®);
|
||||
pcmcia_write_config_byte(link, CISREG_CCSR, 0x04);
|
||||
for (i = 0; i < 32; i++) {
|
||||
j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
|
||||
j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2);
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include <linux/arcdevice.h>
|
||||
#include <linux/com20020.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -159,9 +158,8 @@ static int com20020_probe(struct pcmcia_device *p_dev)
|
|||
/* fill in our module parameters as defaults */
|
||||
dev->dev_addr[0] = node;
|
||||
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.IOAddrLines = 16;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -246,20 +244,24 @@ static int com20020_config(struct pcmcia_device *link)
|
|||
|
||||
dev_dbg(&link->dev, "com20020_config\n");
|
||||
|
||||
dev_dbg(&link->dev, "baseport1 is %Xh\n", link->io.BasePort1);
|
||||
dev_dbg(&link->dev, "baseport1 is %Xh\n",
|
||||
(unsigned int) link->resource[0]->start);
|
||||
|
||||
i = -ENODEV;
|
||||
if (!link->io.BasePort1)
|
||||
link->io_lines = 16;
|
||||
|
||||
if (!link->resource[0]->start)
|
||||
{
|
||||
for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)
|
||||
{
|
||||
link->io.BasePort1 = ioaddr;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = ioaddr;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
i = pcmcia_request_io(link);
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
|
@ -267,7 +269,7 @@ static int com20020_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
}
|
||||
|
||||
ioaddr = dev->base_addr = link->io.BasePort1;
|
||||
ioaddr = dev->base_addr = link->resource[0]->start;
|
||||
dev_dbg(&link->dev, "got ioaddr %Xh\n", ioaddr);
|
||||
|
||||
dev_dbg(&link->dev, "request IRQ %d\n",
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/crc32.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -249,9 +248,8 @@ static int fmvj18x_probe(struct pcmcia_device *link)
|
|||
lp->base = NULL;
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
link->io.NumPorts1 = 32;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 5;
|
||||
link->resource[0]->end = 32;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
/* General socket configuration */
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -289,13 +287,13 @@ static int mfc_try_io_port(struct pcmcia_device *link)
|
|||
{ 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
link->io.BasePort2 = serial_base[i];
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
if (link->io.BasePort2 == 0) {
|
||||
link->io.NumPorts2 = 0;
|
||||
link->resource[1]->start = serial_base[i];
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
if (link->resource[1]->start == 0) {
|
||||
link->resource[1]->end = 0;
|
||||
printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
|
||||
}
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
}
|
||||
|
@ -311,12 +309,12 @@ static int ungermann_try_io_port(struct pcmcia_device *link)
|
|||
0x380,0x3c0 only for ioport.
|
||||
*/
|
||||
for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
|
||||
link->io.BasePort1 = ioaddr;
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = ioaddr;
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret == 0) {
|
||||
/* calculate ConfigIndex value */
|
||||
link->conf.ConfigIndex =
|
||||
((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
|
||||
((link->resource[0]->start & 0x0f0) >> 3) | 0x22;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
@ -346,6 +344,8 @@ static int fmvj18x_config(struct pcmcia_device *link)
|
|||
|
||||
dev_dbg(&link->dev, "fmvj18x_config\n");
|
||||
|
||||
link->io_lines = 5;
|
||||
|
||||
len = pcmcia_get_tuple(link, CISTPL_FUNCE, &buf);
|
||||
kfree(buf);
|
||||
|
||||
|
@ -364,20 +364,20 @@ static int fmvj18x_config(struct pcmcia_device *link)
|
|||
/* MultiFunction Card */
|
||||
link->conf.ConfigBase = 0x800;
|
||||
link->conf.ConfigIndex = 0x47;
|
||||
link->io.NumPorts2 = 8;
|
||||
link->resource[1]->end = 8;
|
||||
}
|
||||
break;
|
||||
case MANFID_NEC:
|
||||
cardtype = NEC; /* MultiFunction Card */
|
||||
link->conf.ConfigBase = 0x800;
|
||||
link->conf.ConfigIndex = 0x47;
|
||||
link->io.NumPorts2 = 8;
|
||||
link->resource[1]->end = 8;
|
||||
break;
|
||||
case MANFID_KME:
|
||||
cardtype = KME; /* MultiFunction Card */
|
||||
link->conf.ConfigBase = 0x800;
|
||||
link->conf.ConfigIndex = 0x47;
|
||||
link->io.NumPorts2 = 8;
|
||||
link->resource[1]->end = 8;
|
||||
break;
|
||||
case MANFID_CONTEC:
|
||||
cardtype = CONTEC;
|
||||
|
@ -418,14 +418,14 @@ static int fmvj18x_config(struct pcmcia_device *link)
|
|||
}
|
||||
}
|
||||
|
||||
if (link->io.NumPorts2 != 0) {
|
||||
if (link->resource[1]->end != 0) {
|
||||
ret = mfc_try_io_port(link);
|
||||
if (ret != 0) goto failed;
|
||||
} else if (cardtype == UNGERMANN) {
|
||||
ret = ungermann_try_io_port(link);
|
||||
if (ret != 0) goto failed;
|
||||
} else {
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
|
@ -437,9 +437,9 @@ static int fmvj18x_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
if (link->io.BasePort2 != 0) {
|
||||
if (resource_size(link->resource[1]) != 0) {
|
||||
ret = fmvj18x_setup_mfc(link);
|
||||
if (ret != 0) goto failed;
|
||||
}
|
||||
|
@ -545,7 +545,6 @@ static int fmvj18x_config(struct pcmcia_device *link)
|
|||
static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
|
||||
{
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
u_char __iomem *base;
|
||||
int i, j;
|
||||
|
||||
|
@ -558,9 +557,7 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
|
|||
return -1;
|
||||
|
||||
base = ioremap(req.Base, req.Size);
|
||||
mem.Page = 0;
|
||||
mem.CardOffset = 0;
|
||||
pcmcia_map_mem_page(link, link->win, &mem);
|
||||
pcmcia_map_mem_page(link, link->win, 0);
|
||||
|
||||
/*
|
||||
* MBH10304 CISTPL_FUNCE_LAN_NODE_ID format
|
||||
|
@ -594,7 +591,6 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
|
|||
static int fmvj18x_setup_mfc(struct pcmcia_device *link)
|
||||
{
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
int i;
|
||||
struct net_device *dev = link->priv;
|
||||
unsigned int ioaddr;
|
||||
|
@ -614,9 +610,7 @@ static int fmvj18x_setup_mfc(struct pcmcia_device *link)
|
|||
return -1;
|
||||
}
|
||||
|
||||
mem.Page = 0;
|
||||
mem.CardOffset = 0;
|
||||
i = pcmcia_map_mem_page(link, link->win, &mem);
|
||||
i = pcmcia_map_mem_page(link, link->win, 0);
|
||||
if (i != 0) {
|
||||
iounmap(lp->base);
|
||||
lp->base = NULL;
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
#include <linux/trdevice.h>
|
||||
#include <linux/ibmtr.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -152,9 +151,8 @@ static int __devinit ibmtr_attach(struct pcmcia_device *link)
|
|||
link->priv = info;
|
||||
info->ti = netdev_priv(dev);
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 4;
|
||||
link->io.IOAddrLines = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 4;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
@ -213,26 +211,26 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
|
|||
struct net_device *dev = info->dev;
|
||||
struct tok_info *ti = netdev_priv(dev);
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
int i, ret;
|
||||
|
||||
dev_dbg(&link->dev, "ibmtr_config\n");
|
||||
|
||||
link->conf.ConfigIndex = 0x61;
|
||||
link->io_lines = 16;
|
||||
|
||||
/* Determine if this is PRIMARY or ALTERNATE. */
|
||||
|
||||
/* Try PRIMARY card at 0xA20-0xA23 */
|
||||
link->io.BasePort1 = 0xA20;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = 0xA20;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i != 0) {
|
||||
/* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */
|
||||
link->io.BasePort1 = 0xA24;
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = 0xA24;
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
|
||||
if (ret)
|
||||
|
@ -251,9 +249,7 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
mem.CardOffset = mmiobase;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, link->win, &mem);
|
||||
ret = pcmcia_map_mem_page(link, link->win, mmiobase);
|
||||
if (ret)
|
||||
goto failed;
|
||||
ti->mmio = ioremap(req.Base, req.Size);
|
||||
|
@ -268,13 +264,11 @@ static int __devinit ibmtr_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
mem.CardOffset = srambase;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, info->sram_win_handle, &mem);
|
||||
ret = pcmcia_map_mem_page(link, info->sram_win_handle, srambase);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
ti->sram_base = mem.CardOffset >> 12;
|
||||
ti->sram_base = srambase >> 12;
|
||||
ti->sram_virt = ioremap(req.Base, req.Size);
|
||||
ti->sram_phys = req.Base;
|
||||
|
||||
|
@ -325,7 +319,6 @@ static void ibmtr_release(struct pcmcia_device *link)
|
|||
if (link->win) {
|
||||
struct tok_info *ti = netdev_priv(dev);
|
||||
iounmap(ti->mmio);
|
||||
pcmcia_release_window(link, info->sram_win_handle);
|
||||
}
|
||||
pcmcia_disable_device(link);
|
||||
}
|
||||
|
|
|
@ -146,7 +146,6 @@ Include Files
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -459,9 +458,8 @@ static int nmclan_probe(struct pcmcia_device *link)
|
|||
link->priv = dev;
|
||||
|
||||
spin_lock_init(&lp->bank_lock);
|
||||
link->io.NumPorts1 = 32;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 5;
|
||||
link->resource[0]->end = 32;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 1;
|
||||
|
@ -645,7 +643,8 @@ static int nmclan_config(struct pcmcia_device *link)
|
|||
|
||||
dev_dbg(&link->dev, "nmclan_config\n");
|
||||
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
link->io_lines = 5;
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
ret = pcmcia_request_exclusive_irq(link, mace_interrupt);
|
||||
|
@ -656,7 +655,7 @@ static int nmclan_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
|
@ -758,29 +757,20 @@ static void nmclan_reset(struct net_device *dev)
|
|||
|
||||
#if RESET_XILINX
|
||||
struct pcmcia_device *link = &lp->link;
|
||||
conf_reg_t reg;
|
||||
u_long OrigCorValue;
|
||||
u8 OrigCorValue;
|
||||
|
||||
/* Save original COR value */
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = 0;
|
||||
pcmcia_access_configuration_register(link, ®);
|
||||
OrigCorValue = reg.Value;
|
||||
pcmcia_read_config_byte(link, CISREG_COR, &OrigCorValue);
|
||||
|
||||
/* Reset Xilinx */
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
|
||||
dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%x, resetting...\n",
|
||||
OrigCorValue);
|
||||
reg.Value = COR_SOFT_RESET;
|
||||
pcmcia_access_configuration_register(link, ®);
|
||||
pcmcia_write_config_byte(link, CISREG_COR, COR_SOFT_RESET);
|
||||
/* Need to wait for 20 ms for PCMCIA to finish reset. */
|
||||
|
||||
/* Restore original COR configuration index */
|
||||
reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
|
||||
pcmcia_access_configuration_register(link, ®);
|
||||
pcmcia_write_config_byte(link, CISREG_COR,
|
||||
(COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK)));
|
||||
/* Xilinx is now completely reset along with the MACE chip. */
|
||||
lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include <linux/mii.h>
|
||||
#include "../8390.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -113,8 +112,6 @@ static int setup_dma_config(struct pcmcia_device *link, int start_pg,
|
|||
|
||||
static void pcnet_detach(struct pcmcia_device *p_dev);
|
||||
|
||||
static dev_info_t dev_info = "pcnet_cs";
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
typedef struct hw_info_t {
|
||||
|
@ -304,7 +301,6 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link)
|
|||
{
|
||||
struct net_device *dev = link->priv;
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
u_char __iomem *base, *virt;
|
||||
int i, j;
|
||||
|
||||
|
@ -317,10 +313,8 @@ static hw_info_t *get_hwinfo(struct pcmcia_device *link)
|
|||
return NULL;
|
||||
|
||||
virt = ioremap(req.Base, req.Size);
|
||||
mem.Page = 0;
|
||||
for (i = 0; i < NR_INFO; i++) {
|
||||
mem.CardOffset = hw_info[i].offset & ~(req.Size-1);
|
||||
pcmcia_map_mem_page(link, link->win, &mem);
|
||||
pcmcia_map_mem_page(link, link->win, hw_info[i].offset & ~(req.Size-1));
|
||||
base = &virt[hw_info[i].offset & (req.Size-1)];
|
||||
if ((readb(base+0) == hw_info[i].a0) &&
|
||||
(readb(base+2) == hw_info[i].a1) &&
|
||||
|
@ -480,29 +474,31 @@ static hw_info_t *get_hwired(struct pcmcia_device *link)
|
|||
static int try_io_port(struct pcmcia_device *link)
|
||||
{
|
||||
int j, ret;
|
||||
if (link->io.NumPorts1 == 32) {
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (link->io.NumPorts2 > 0) {
|
||||
link->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
link->resource[1]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
if (link->resource[0]->end == 32) {
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (link->resource[1]->end > 0) {
|
||||
/* for master/slave multifunction cards */
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
}
|
||||
} else {
|
||||
/* This should be two 16-port windows */
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
}
|
||||
if (link->io.BasePort1 == 0) {
|
||||
link->io.IOAddrLines = 16;
|
||||
if (link->resource[0]->start == 0) {
|
||||
for (j = 0; j < 0x400; j += 0x20) {
|
||||
link->io.BasePort1 = j ^ 0x300;
|
||||
link->io.BasePort2 = (j ^ 0x300) + 0x10;
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = j ^ 0x300;
|
||||
link->resource[1]->start = (j ^ 0x300) + 0x10;
|
||||
link->io_lines = 16;
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
return pcmcia_request_io(link, &link->io);
|
||||
return pcmcia_request_io(link);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -523,18 +519,18 @@ static int pcnet_confcheck(struct pcmcia_device *p_dev,
|
|||
network function with window 0, and serial with window 1 */
|
||||
if (io->nwin > 1) {
|
||||
i = (io->win[1].len > io->win[0].len);
|
||||
p_dev->io.BasePort2 = io->win[1-i].base;
|
||||
p_dev->io.NumPorts2 = io->win[1-i].len;
|
||||
p_dev->resource[1]->start = io->win[1-i].base;
|
||||
p_dev->resource[1]->end = io->win[1-i].len;
|
||||
} else {
|
||||
i = p_dev->io.NumPorts2 = 0;
|
||||
i = p_dev->resource[1]->end = 0;
|
||||
}
|
||||
|
||||
*has_shmem = ((cfg->mem.nwin == 1) &&
|
||||
(cfg->mem.win[0].len >= 0x4000));
|
||||
p_dev->io.BasePort1 = io->win[i].base;
|
||||
p_dev->io.NumPorts1 = io->win[i].len;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32)
|
||||
p_dev->resource[0]->start = io->win[i].base;
|
||||
p_dev->resource[0]->end = io->win[i].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (p_dev->resource[0]->end + p_dev->resource[1]->end >= 32)
|
||||
return try_io_port(p_dev);
|
||||
|
||||
return 0;
|
||||
|
@ -557,7 +553,7 @@ static int pcnet_config(struct pcmcia_device *link)
|
|||
if (!link->irq)
|
||||
goto failed;
|
||||
|
||||
if (link->io.NumPorts2 == 8) {
|
||||
if (resource_size(link->resource[1]) == 8) {
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status = CCSR_AUDIO_ENA;
|
||||
}
|
||||
|
@ -569,7 +565,7 @@ static int pcnet_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
if (info->flags & HAS_MISC_REG) {
|
||||
if ((if_port == 1) || (if_port == 2))
|
||||
dev->if_port = if_port;
|
||||
|
@ -956,7 +952,7 @@ static int pcnet_open(struct net_device *dev)
|
|||
set_misc_reg(dev);
|
||||
|
||||
outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */
|
||||
ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev);
|
||||
ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev->name, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -1464,7 +1460,6 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
|
|||
struct net_device *dev = link->priv;
|
||||
pcnet_dev_t *info = PRIV(dev);
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
int i, window_size, offset, ret;
|
||||
|
||||
window_size = (stop_pg - start_pg) << 8;
|
||||
|
@ -1483,11 +1478,9 @@ static int setup_shmem_window(struct pcmcia_device *link, int start_pg,
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
mem.CardOffset = (start_pg << 8) + cm_offset;
|
||||
offset = mem.CardOffset % window_size;
|
||||
mem.CardOffset -= offset;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, link->win, &mem);
|
||||
offset = (start_pg << 8) + cm_offset;
|
||||
offset -= offset % window_size;
|
||||
ret = pcmcia_map_mem_page(link, link->win, offset);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include <linux/jiffies.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -325,9 +324,8 @@ static int smc91c92_probe(struct pcmcia_device *link)
|
|||
link->priv = dev;
|
||||
|
||||
spin_lock_init(&smc->lock);
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 4;
|
||||
link->resource[0]->end = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -428,12 +426,13 @@ static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
|
|||
void *priv_data)
|
||||
{
|
||||
int k;
|
||||
p_dev->io.BasePort2 = cf->io.win[0].base;
|
||||
p_dev->resource[1]->start = cf->io.win[0].base;
|
||||
for (k = 0; k < 0x400; k += 0x10) {
|
||||
if (k & 0x80)
|
||||
continue;
|
||||
p_dev->io.BasePort1 = k ^ 0x300;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = k ^ 0x300;
|
||||
p_dev->io_lines = 16;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -444,21 +443,20 @@ static int mhz_mfc_config(struct pcmcia_device *link)
|
|||
struct net_device *dev = link->priv;
|
||||
struct smc_private *smc = netdev_priv(dev);
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
unsigned int offset;
|
||||
int i;
|
||||
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status = CCSR_AUDIO_ENA;
|
||||
link->io.IOAddrLines = 16;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts2 = 8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->end = 8;
|
||||
|
||||
/* The Megahertz combo cards have modem-like CIS entries, so
|
||||
we have to explicitly try a bunch of port combinations. */
|
||||
if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL))
|
||||
return -ENODEV;
|
||||
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
/* Allocate a memory window, for accessing the ISR */
|
||||
req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
|
||||
|
@ -469,11 +467,8 @@ static int mhz_mfc_config(struct pcmcia_device *link)
|
|||
return -ENODEV;
|
||||
|
||||
smc->base = ioremap(req.Base, req.Size);
|
||||
mem.CardOffset = mem.Page = 0;
|
||||
if (smc->manfid == MANFID_MOTOROLA)
|
||||
mem.CardOffset = link->conf.ConfigBase;
|
||||
i = pcmcia_map_mem_page(link, link->win, &mem);
|
||||
|
||||
offset = (smc->manfid == MANFID_MOTOROLA) ? link->conf.ConfigBase : 0;
|
||||
i = pcmcia_map_mem_page(link, link->win, offset);
|
||||
if ((i == 0) &&
|
||||
(smc->manfid == MANFID_MEGAHERTZ) &&
|
||||
(smc->cardid == PRODID_MEGAHERTZ_EM3288))
|
||||
|
@ -546,7 +541,7 @@ static void mot_config(struct pcmcia_device *link)
|
|||
struct net_device *dev = link->priv;
|
||||
struct smc_private *smc = netdev_priv(dev);
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
unsigned int iouart = link->io.BasePort2;
|
||||
unsigned int iouart = link->resource[1]->start;
|
||||
|
||||
/* Set UART base address and force map with COR bit 1 */
|
||||
writeb(iouart & 0xff, smc->base + MOT_UART + CISREG_IOBASE_0);
|
||||
|
@ -602,9 +597,9 @@ static int smc_configcheck(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int smc_config(struct pcmcia_device *link)
|
||||
|
@ -612,10 +607,10 @@ static int smc_config(struct pcmcia_device *link)
|
|||
struct net_device *dev = link->priv;
|
||||
int i;
|
||||
|
||||
link->io.NumPorts1 = 16;
|
||||
link->resource[0]->end = 16;
|
||||
i = pcmcia_loop_config(link, smc_configcheck, NULL);
|
||||
if (!i)
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
@ -647,27 +642,27 @@ static int osi_config(struct pcmcia_device *link)
|
|||
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status = CCSR_AUDIO_ENA;
|
||||
link->io.NumPorts1 = 64;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts2 = 8;
|
||||
link->io.IOAddrLines = 16;
|
||||
link->resource[0]->end = 64;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->end = 8;
|
||||
|
||||
/* Enable Hard Decode, LAN, Modem */
|
||||
link->conf.ConfigIndex = 0x23;
|
||||
link->io_lines = 16;
|
||||
|
||||
for (i = j = 0; j < 4; j++) {
|
||||
link->io.BasePort2 = com[j];
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[1]->start = com[j];
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
if (i != 0) {
|
||||
/* Fallback: turn off hard decode */
|
||||
link->conf.ConfigIndex = 0x03;
|
||||
link->io.NumPorts2 = 0;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[1]->end = 0;
|
||||
i = pcmcia_request_io(link);
|
||||
}
|
||||
dev->base_addr = link->io.BasePort1 + 0x10;
|
||||
dev->base_addr = link->resource[0]->start + 0x10;
|
||||
return i;
|
||||
}
|
||||
|
||||
|
@ -684,7 +679,7 @@ static int osi_load_firmware(struct pcmcia_device *link)
|
|||
|
||||
/* Download the Seven of Diamonds firmware */
|
||||
for (i = 0; i < fw->size; i++) {
|
||||
outb(fw->data[i], link->io.BasePort1 + 2);
|
||||
outb(fw->data[i], link->resource[0]->start + 2);
|
||||
udelay(50);
|
||||
}
|
||||
release_firmware(fw);
|
||||
|
@ -726,12 +721,12 @@ static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
|
|||
return rc;
|
||||
} else if (manfid == MANFID_OSITECH) {
|
||||
/* Make sure both functions are powered up */
|
||||
set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
|
||||
set_bits(0x300, link->resource[0]->start + OSITECH_AUI_PWR);
|
||||
/* Now, turn on the interrupt for both card functions */
|
||||
set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
|
||||
set_bits(0x300, link->resource[0]->start + OSITECH_RESET_ISR);
|
||||
dev_dbg(&link->dev, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
|
||||
inw(link->io.BasePort1 + OSITECH_AUI_PWR),
|
||||
inw(link->io.BasePort1 + OSITECH_RESET_ISR));
|
||||
inw(link->resource[0]->start + OSITECH_AUI_PWR),
|
||||
inw(link->resource[0]->start + OSITECH_RESET_ISR));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -804,7 +799,7 @@ static int check_sig(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
/* Try setting bus width */
|
||||
width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
|
||||
width = (link->resource[0]->flags == IO_DATA_PATH_WIDTH_AUTO);
|
||||
s = inb(ioaddr + CONFIG);
|
||||
if (width)
|
||||
s |= CFG_16BIT;
|
||||
|
|
|
@ -82,7 +82,6 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/mii.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -678,9 +677,9 @@ xirc2ps_config_modem(struct pcmcia_device *p_dev,
|
|||
|
||||
if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) {
|
||||
for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
|
||||
p_dev->io.BasePort2 = cf->io.win[0].base;
|
||||
p_dev->io.BasePort1 = ioaddr;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[1]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->start = ioaddr;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -697,11 +696,11 @@ xirc2ps_config_check(struct pcmcia_device *p_dev,
|
|||
int *pass = priv_data;
|
||||
|
||||
if (cf->io.nwin > 0 && (cf->io.win[0].base & 0xf) == 8) {
|
||||
p_dev->io.BasePort2 = cf->io.win[0].base;
|
||||
p_dev->io.BasePort1 = p_dev->io.BasePort2
|
||||
p_dev->resource[1]->start = cf->io.win[0].base;
|
||||
p_dev->resource[0]->start = p_dev->resource[1]->start
|
||||
+ (*pass ? (cf->index & 0x20 ? -24:8)
|
||||
: (cf->index & 0x20 ? 8:-24));
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -808,8 +807,7 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
goto failure;
|
||||
}
|
||||
|
||||
link->io.IOAddrLines =10;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
if (local->modem) {
|
||||
int pass;
|
||||
|
||||
|
@ -817,16 +815,16 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status |= CCSR_AUDIO_ENA;
|
||||
}
|
||||
link->io.NumPorts2 = 8;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->end = 8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
if (local->dingo) {
|
||||
/* Take the Modem IO port from the CIS and scan for a free
|
||||
* Ethernet port */
|
||||
link->io.NumPorts1 = 16; /* no Mako stuff anymore */
|
||||
link->resource[0]->end = 16; /* no Mako stuff anymore */
|
||||
if (!pcmcia_loop_config(link, xirc2ps_config_modem, NULL))
|
||||
goto port_found;
|
||||
} else {
|
||||
link->io.NumPorts1 = 18;
|
||||
link->resource[0]->end = 18;
|
||||
/* We do 2 passes here: The first one uses the regular mapping and
|
||||
* the second tries again, thereby considering that the 32 ports are
|
||||
* mirrored every 32 bytes. Actually we use a mirrored port for
|
||||
|
@ -841,14 +839,15 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
}
|
||||
printk(KNOT_XIRC "no ports available\n");
|
||||
} else {
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io_lines = 10;
|
||||
link->resource[0]->end = 16;
|
||||
for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
|
||||
link->io.BasePort1 = ioaddr;
|
||||
if (!(err=pcmcia_request_io(link, &link->io)))
|
||||
link->resource[0]->start = ioaddr;
|
||||
if (!(err = pcmcia_request_io(link)))
|
||||
goto port_found;
|
||||
}
|
||||
link->io.BasePort1 = 0; /* let CS decide */
|
||||
if ((err=pcmcia_request_io(link, &link->io)))
|
||||
link->resource[0]->start = 0; /* let CS decide */
|
||||
if ((err = pcmcia_request_io(link)))
|
||||
goto config_error;
|
||||
}
|
||||
port_found:
|
||||
|
@ -870,24 +869,21 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
goto config_error;
|
||||
|
||||
if (local->dingo) {
|
||||
conf_reg_t reg;
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
|
||||
/* Reset the modem's BAR to the correct value
|
||||
* This is necessary because in the RequestConfiguration call,
|
||||
* the base address of the ethernet port (BasePort1) is written
|
||||
* to the BAR registers of the modem.
|
||||
*/
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_IOBASE_0;
|
||||
reg.Value = link->io.BasePort2 & 0xff;
|
||||
if ((err = pcmcia_access_configuration_register(link, ®)))
|
||||
err = pcmcia_write_config_byte(link, CISREG_IOBASE_0, (u8)
|
||||
link->resource[1]->start & 0xff);
|
||||
if (err)
|
||||
goto config_error;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_IOBASE_1;
|
||||
reg.Value = (link->io.BasePort2 >> 8) & 0xff;
|
||||
if ((err = pcmcia_access_configuration_register(link, ®)))
|
||||
|
||||
err = pcmcia_write_config_byte(link, CISREG_IOBASE_1,
|
||||
(link->resource[1]->start >> 8) & 0xff);
|
||||
if (err)
|
||||
goto config_error;
|
||||
|
||||
/* There is no config entry for the Ethernet part which
|
||||
|
@ -901,16 +897,14 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
goto config_error;
|
||||
|
||||
local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
|
||||
mem.CardOffset = 0x0;
|
||||
mem.Page = 0;
|
||||
if ((err = pcmcia_map_mem_page(link, link->win, &mem)))
|
||||
if ((err = pcmcia_map_mem_page(link, link->win, 0)))
|
||||
goto config_error;
|
||||
|
||||
/* Setup the CCRs; there are no infos in the CIS about the Ethernet
|
||||
* part.
|
||||
*/
|
||||
writeb(0x47, local->dingo_ccr + CISREG_COR);
|
||||
ioaddr = link->io.BasePort1;
|
||||
ioaddr = link->resource[0]->start;
|
||||
writeb(ioaddr & 0xff , local->dingo_ccr + CISREG_IOBASE_0);
|
||||
writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1);
|
||||
|
||||
|
@ -957,7 +951,7 @@ xirc2ps_config(struct pcmcia_device * link)
|
|||
|
||||
/* we can now register the device with the net subsystem */
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
if (local->dingo)
|
||||
do_reset(dev, 1); /* a kludge to make the cem56 work */
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -155,8 +154,6 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
win_req_t *req = priv_data;
|
||||
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -176,52 +173,25 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
Now set up a common memory window, if needed. There is room
|
||||
in the struct pcmcia_device structure for one memory window handle,
|
||||
but if the base addresses need to be saved, or if multiple
|
||||
windows are needed, the info should go in the private data
|
||||
structure for this device.
|
||||
|
||||
Note that the memory window base is a physical address, and
|
||||
needs to be mapped to virtual space with ioremap() before it
|
||||
is used.
|
||||
*/
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
memreq_t map;
|
||||
req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
|
||||
req->Base = mem->win[0].host_addr;
|
||||
req->Size = mem->win[0].len;
|
||||
req->AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, req, &p_dev->win) != 0)
|
||||
return -ENODEV;
|
||||
map.Page = 0;
|
||||
map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
/* If we got this far, we're cool! */
|
||||
return 0;
|
||||
}
|
||||
|
@ -230,17 +200,12 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
|
|||
static int airo_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
win_req_t *req;
|
||||
int ret;
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
dev_dbg(&link->dev, "airo_config\n");
|
||||
|
||||
req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
|
||||
if (!req)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* In this loop, we scan the CIS for configuration table
|
||||
* entries, each of which describes a valid card
|
||||
|
@ -255,7 +220,7 @@ static int airo_config(struct pcmcia_device *link)
|
|||
* and most client drivers will only use the CIS to fill in
|
||||
* implementation-defined details.
|
||||
*/
|
||||
ret = pcmcia_loop_config(link, airo_cs_config_check, req);
|
||||
ret = pcmcia_loop_config(link, airo_cs_config_check, NULL);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
@ -272,7 +237,7 @@ static int airo_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
((local_info_t *)link->priv)->eth_dev =
|
||||
init_airo_card(link->irq,
|
||||
link->io.BasePort1, 1, &link->dev);
|
||||
link->resource[0]->start, 1, &link->dev);
|
||||
if (!((local_info_t *)link->priv)->eth_dev)
|
||||
goto failed;
|
||||
|
||||
|
@ -282,22 +247,15 @@ static int airo_config(struct pcmcia_device *link)
|
|||
if (link->conf.Vpp)
|
||||
printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", req->Base,
|
||||
req->Base+req->Size-1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
kfree(req);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
airo_release(link);
|
||||
kfree(req);
|
||||
return -ENODEV;
|
||||
} /* airo_config */
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -191,25 +190,23 @@ static int atmel_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int atmel_config(struct pcmcia_device *link)
|
||||
|
@ -254,7 +251,7 @@ static int atmel_config(struct pcmcia_device *link)
|
|||
|
||||
((local_info_t*)link->priv)->eth_dev =
|
||||
init_atmel_card(link->irq,
|
||||
link->io.BasePort1,
|
||||
link->resource[0]->start,
|
||||
did ? did->driver_info : ATMEL_FW_TYPE_NONE,
|
||||
&link->dev,
|
||||
card_present,
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/ssb/ssb.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -65,7 +64,6 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
|||
{
|
||||
struct ssb_bus *ssb;
|
||||
win_req_t win;
|
||||
memreq_t mem;
|
||||
int err = -ENOMEM;
|
||||
int res = 0;
|
||||
|
||||
|
@ -78,12 +76,7 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
|||
dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
dev->io.BasePort2 = 0;
|
||||
dev->io.NumPorts2 = 0;
|
||||
dev->io.Attributes2 = 0;
|
||||
|
||||
win.Attributes = WIN_ADDR_SPACE_MEM | WIN_MEMORY_TYPE_CM |
|
||||
WIN_ENABLE | WIN_DATA_WIDTH_16 |
|
||||
win.Attributes = WIN_ENABLE | WIN_DATA_WIDTH_16 |
|
||||
WIN_USE_WAIT;
|
||||
win.Base = 0;
|
||||
win.Size = SSB_CORE_SIZE;
|
||||
|
@ -92,9 +85,7 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
|||
if (res != 0)
|
||||
goto err_kfree_ssb;
|
||||
|
||||
mem.CardOffset = 0;
|
||||
mem.Page = 0;
|
||||
res = pcmcia_map_mem_page(dev, dev->win, &mem);
|
||||
res = pcmcia_map_mem_page(dev, dev->win, 0);
|
||||
if (res != 0)
|
||||
goto err_disable;
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
#include <linux/wireless.h>
|
||||
#include <net/iw_handler.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -23,7 +22,7 @@
|
|||
#include "hostap_wlan.h"
|
||||
|
||||
|
||||
static dev_info_t dev_info = "hostap_cs";
|
||||
static char *dev_info = "hostap_cs";
|
||||
|
||||
MODULE_AUTHOR("Jouni Malinen");
|
||||
MODULE_DESCRIPTION("Support for Intersil Prism2-based 802.11 wireless LAN "
|
||||
|
@ -225,27 +224,18 @@ static int prism2_pccard_card_present(local_info_t *local)
|
|||
static void sandisk_set_iobase(local_info_t *local)
|
||||
{
|
||||
int res;
|
||||
conf_reg_t reg;
|
||||
struct hostap_cs_priv *hw_priv = local->hw_priv;
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = 0x10; /* 0x3f0 IO base 1 */
|
||||
reg.Value = hw_priv->link->io.BasePort1 & 0x00ff;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, 0x10,
|
||||
hw_priv->link->resource[0]->start & 0x00ff);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -"
|
||||
" res=%d\n", res);
|
||||
}
|
||||
udelay(10);
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = 0x12; /* 0x3f2 IO base 2 */
|
||||
reg.Value = (hw_priv->link->io.BasePort1 & 0xff00) >> 8;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, 0x12,
|
||||
(hw_priv->link->resource[0]->start >> 8) & 0x00ff);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -"
|
||||
" res=%d\n", res);
|
||||
|
@ -271,12 +261,11 @@ static void sandisk_write_hcr(local_info_t *local, int hcr)
|
|||
static int sandisk_enable_wireless(struct net_device *dev)
|
||||
{
|
||||
int res, ret = 0;
|
||||
conf_reg_t reg;
|
||||
struct hostap_interface *iface = netdev_priv(dev);
|
||||
local_info_t *local = iface->local;
|
||||
struct hostap_cs_priv *hw_priv = local->hw_priv;
|
||||
|
||||
if (hw_priv->link->io.NumPorts1 < 0x42) {
|
||||
if (resource_size(hw_priv->link->resource[0]) < 0x42) {
|
||||
/* Not enough ports to be SanDisk multi-function card */
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
|
@ -298,12 +287,8 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
|||
" - using vendor-specific initialization\n", dev->name);
|
||||
hw_priv->sandisk_connectplus = 1;
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = COR_SOFT_RESET;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
|
||||
COR_SOFT_RESET);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
|
||||
dev->name, res);
|
||||
|
@ -311,16 +296,13 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
|||
}
|
||||
mdelay(5);
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
/*
|
||||
* Do not enable interrupts here to avoid some bogus events. Interrupts
|
||||
* will be enabled during the first cor_sreset call.
|
||||
*/
|
||||
reg.Value = COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | COR_FUNC_ENA;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
|
||||
(COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE |
|
||||
COR_FUNC_ENA));
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",
|
||||
dev->name, res);
|
||||
|
@ -343,30 +325,23 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
|||
static void prism2_pccard_cor_sreset(local_info_t *local)
|
||||
{
|
||||
int res;
|
||||
conf_reg_t reg;
|
||||
u8 val;
|
||||
struct hostap_cs_priv *hw_priv = local->hw_priv;
|
||||
|
||||
if (!prism2_pccard_card_present(local))
|
||||
return;
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = 0;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &val);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n",
|
||||
res);
|
||||
return;
|
||||
}
|
||||
printk(KERN_DEBUG "prism2_pccard_cor_sreset: original COR %02x\n",
|
||||
reg.Value);
|
||||
val);
|
||||
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Value |= COR_SOFT_RESET;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
val |= COR_SOFT_RESET;
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n",
|
||||
res);
|
||||
|
@ -375,11 +350,10 @@ static void prism2_pccard_cor_sreset(local_info_t *local)
|
|||
|
||||
mdelay(hw_priv->sandisk_connectplus ? 5 : 2);
|
||||
|
||||
reg.Value &= ~COR_SOFT_RESET;
|
||||
val &= ~COR_SOFT_RESET;
|
||||
if (hw_priv->sandisk_connectplus)
|
||||
reg.Value |= COR_IREQ_ENA;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
val |= COR_IREQ_ENA;
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n",
|
||||
res);
|
||||
|
@ -396,8 +370,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local)
|
|||
static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
|
||||
{
|
||||
int res;
|
||||
conf_reg_t reg;
|
||||
int old_cor;
|
||||
u8 old_cor;
|
||||
struct hostap_cs_priv *hw_priv = local->hw_priv;
|
||||
|
||||
if (!prism2_pccard_card_present(local))
|
||||
|
@ -408,25 +381,17 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
|
|||
return;
|
||||
}
|
||||
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = 0;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &old_cor);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 "
|
||||
"(%d)\n", res);
|
||||
return;
|
||||
}
|
||||
printk(KERN_DEBUG "prism2_pccard_genesis_sreset: original COR %02x\n",
|
||||
reg.Value);
|
||||
old_cor = reg.Value;
|
||||
old_cor);
|
||||
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Value |= COR_SOFT_RESET;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
|
||||
old_cor | COR_SOFT_RESET);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 "
|
||||
"(%d)\n", res);
|
||||
|
@ -436,11 +401,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
|
|||
mdelay(10);
|
||||
|
||||
/* Setup Genesis mode */
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Value = hcr;
|
||||
reg.Offset = CISREG_CCSR;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_CCSR, hcr);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 "
|
||||
"(%d)\n", res);
|
||||
|
@ -448,11 +409,8 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)
|
|||
}
|
||||
mdelay(10);
|
||||
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = old_cor & ~COR_SOFT_RESET;
|
||||
res = pcmcia_access_configuration_register(hw_priv->link,
|
||||
®);
|
||||
res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR,
|
||||
old_cor & ~COR_SOFT_RESET);
|
||||
if (res != 0) {
|
||||
printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 "
|
||||
"(%d)\n", res);
|
||||
|
@ -561,30 +519,24 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
|
|||
PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d "
|
||||
"dflt->io.nwin=%d\n",
|
||||
cfg->io.nwin, dflt->io.nwin);
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
PDEBUG(DEBUG_EXTRA, "io->flags = 0x%04X, "
|
||||
"io.base=0x%04x, len=%d\n", io->flags,
|
||||
io->win[0].base, io->win[0].len);
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags &
|
||||
CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int prism2_config(struct pcmcia_device *link)
|
||||
|
@ -646,7 +598,7 @@ static int prism2_config(struct pcmcia_device *link)
|
|||
goto failed_unlock;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||
|
||||
|
@ -658,12 +610,10 @@ static int prism2_config(struct pcmcia_device *link)
|
|||
link->conf.Vpp % 10);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
local->shutdown = 0;
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
#include <linux/firmware.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -802,9 +801,9 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
|
||||
/* Do we need to allocate an interrupt? */
|
||||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
@ -816,7 +815,7 @@ static int if_cs_ioprobe(struct pcmcia_device *p_dev,
|
|||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int if_cs_probe(struct pcmcia_device *p_dev)
|
||||
|
@ -854,7 +853,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
|
|||
goto out1;
|
||||
|
||||
/* Initialize io access */
|
||||
card->iobase = ioport_map(p_dev->io.BasePort1, p_dev->io.NumPorts1);
|
||||
card->iobase = ioport_map(p_dev->resource[0]->start,
|
||||
resource_size(p_dev->resource[0]));
|
||||
if (!card->iobase) {
|
||||
lbs_pr_err("error in ioport_map\n");
|
||||
ret = -EIO;
|
||||
|
@ -873,9 +873,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
|
|||
}
|
||||
|
||||
/* Finally, report what we've done */
|
||||
lbs_deb_cs("irq %d, io 0x%04x-0x%04x\n",
|
||||
p_dev->irq, p_dev->io.BasePort1,
|
||||
p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1);
|
||||
lbs_deb_cs("irq %d, io %pR", p_dev->irq, p_dev->resource[0]);
|
||||
|
||||
/*
|
||||
* Most of the libertas cards can do unaligned register access, but some
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -192,25 +191,23 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
goto next_entry;
|
||||
}
|
||||
return 0;
|
||||
|
@ -258,7 +255,8 @@ orinoco_cs_config(struct pcmcia_device *link)
|
|||
/* We initialize the hermes structure before completing PCMCIA
|
||||
* configuration just in case the interrupt handler gets
|
||||
* called. */
|
||||
mem = ioport_map(link->io.BasePort1, link->io.NumPorts1);
|
||||
mem = ioport_map(link->resource[0]->start,
|
||||
resource_size(link->resource[0]));
|
||||
if (!mem)
|
||||
goto failed;
|
||||
|
||||
|
@ -280,7 +278,7 @@ orinoco_cs_config(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
/* Register an interface with the stack */
|
||||
if (orinoco_if_add(priv, link->io.BasePort1,
|
||||
if (orinoco_if_add(priv, link->resource[0]->start,
|
||||
link->irq, NULL) != 0) {
|
||||
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
|
||||
goto failed;
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -80,35 +79,27 @@ static int
|
|||
spectrum_reset(struct pcmcia_device *link, int idle)
|
||||
{
|
||||
int ret;
|
||||
conf_reg_t reg;
|
||||
u_int save_cor;
|
||||
u8 save_cor;
|
||||
u8 ccsr;
|
||||
|
||||
/* Doing it if hardware is gone is guaranteed crash */
|
||||
if (!pcmcia_dev_present(link))
|
||||
return -ENODEV;
|
||||
|
||||
/* Save original COR value */
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_COR;
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_read_config_byte(link, CISREG_COR, &save_cor);
|
||||
if (ret)
|
||||
goto failed;
|
||||
save_cor = reg.Value;
|
||||
|
||||
/* Soft-Reset card */
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = (save_cor | COR_SOFT_RESET);
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_write_config_byte(link, CISREG_COR,
|
||||
(save_cor | COR_SOFT_RESET));
|
||||
if (ret)
|
||||
goto failed;
|
||||
udelay(1000);
|
||||
|
||||
/* Read CCSR */
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_CCSR;
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_read_config_byte(link, CISREG_CCSR, &ccsr);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
@ -116,19 +107,15 @@ spectrum_reset(struct pcmcia_device *link, int idle)
|
|||
* Start or stop the firmware. Memory width bit should be
|
||||
* preserved from the value we've just read.
|
||||
*/
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_CCSR;
|
||||
reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16);
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ccsr = (idle ? HCR_IDLE : HCR_RUN) | (ccsr & HCR_MEM16);
|
||||
ret = pcmcia_write_config_byte(link, CISREG_CCSR, ccsr);
|
||||
if (ret)
|
||||
goto failed;
|
||||
udelay(1000);
|
||||
|
||||
/* Restore original COR configuration index */
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_COR;
|
||||
reg.Value = (save_cor & ~COR_SOFT_RESET);
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_write_config_byte(link, CISREG_COR,
|
||||
(save_cor & ~COR_SOFT_RESET));
|
||||
if (ret)
|
||||
goto failed;
|
||||
udelay(1000);
|
||||
|
@ -266,25 +253,23 @@ static int spectrum_cs_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
goto next_entry;
|
||||
}
|
||||
return 0;
|
||||
|
@ -332,7 +317,8 @@ spectrum_cs_config(struct pcmcia_device *link)
|
|||
/* We initialize the hermes structure before completing PCMCIA
|
||||
* configuration just in case the interrupt handler gets
|
||||
* called. */
|
||||
mem = ioport_map(link->io.BasePort1, link->io.NumPorts1);
|
||||
mem = ioport_map(link->resource[0]->start,
|
||||
resource_size(link->resource[0]));
|
||||
if (!mem)
|
||||
goto failed;
|
||||
|
||||
|
@ -359,7 +345,7 @@ spectrum_cs_config(struct pcmcia_device *link)
|
|||
}
|
||||
|
||||
/* Register an interface with the stack */
|
||||
if (orinoco_if_add(priv, link->io.BasePort1,
|
||||
if (orinoco_if_add(priv, link->resource[0]->start,
|
||||
link->irq, NULL) != 0) {
|
||||
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
|
||||
goto failed;
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#include <linux/ethtool.h>
|
||||
#include <linux/ieee80211.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -315,9 +314,8 @@ static int ray_probe(struct pcmcia_device *p_dev)
|
|||
local->finder = p_dev;
|
||||
|
||||
/* The io structure describes IO port mapping. None used here */
|
||||
p_dev->io.NumPorts1 = 0;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = 5;
|
||||
p_dev->resource[0]->end = 0;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -394,7 +392,6 @@ static int ray_config(struct pcmcia_device *link)
|
|||
int ret = 0;
|
||||
int i;
|
||||
win_req_t req;
|
||||
memreq_t mem;
|
||||
struct net_device *dev = (struct net_device *)link->priv;
|
||||
ray_dev_t *local = netdev_priv(dev);
|
||||
|
||||
|
@ -431,9 +428,7 @@ static int ray_config(struct pcmcia_device *link)
|
|||
ret = pcmcia_request_window(link, &req, &link->win);
|
||||
if (ret)
|
||||
goto failed;
|
||||
mem.CardOffset = 0x0000;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, link->win, &mem);
|
||||
ret = pcmcia_map_mem_page(link, link->win, 0);
|
||||
if (ret)
|
||||
goto failed;
|
||||
local->sram = ioremap(req.Base, req.Size);
|
||||
|
@ -447,9 +442,7 @@ static int ray_config(struct pcmcia_device *link)
|
|||
ret = pcmcia_request_window(link, &req, &local->rmem_handle);
|
||||
if (ret)
|
||||
goto failed;
|
||||
mem.CardOffset = 0x8000;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, local->rmem_handle, &mem);
|
||||
ret = pcmcia_map_mem_page(link, local->rmem_handle, 0x8000);
|
||||
if (ret)
|
||||
goto failed;
|
||||
local->rmem = ioremap(req.Base, req.Size);
|
||||
|
@ -463,9 +456,7 @@ static int ray_config(struct pcmcia_device *link)
|
|||
ret = pcmcia_request_window(link, &req, &local->amem_handle);
|
||||
if (ret)
|
||||
goto failed;
|
||||
mem.CardOffset = 0x0000;
|
||||
mem.Page = 0;
|
||||
ret = pcmcia_map_mem_page(link, local->amem_handle, &mem);
|
||||
ret = pcmcia_map_mem_page(link, local->amem_handle, 0);
|
||||
if (ret)
|
||||
goto failed;
|
||||
local->amem = ioremap(req.Base, req.Size);
|
||||
|
@ -793,7 +784,6 @@ static void ray_release(struct pcmcia_device *link)
|
|||
{
|
||||
struct net_device *dev = link->priv;
|
||||
ray_dev_t *local = netdev_priv(dev);
|
||||
int i;
|
||||
|
||||
dev_dbg(&link->dev, "ray_release\n");
|
||||
|
||||
|
@ -802,13 +792,6 @@ static void ray_release(struct pcmcia_device *link)
|
|||
iounmap(local->sram);
|
||||
iounmap(local->rmem);
|
||||
iounmap(local->amem);
|
||||
/* Do bother checking to see if these succeed or not */
|
||||
i = pcmcia_release_window(link, local->amem_handle);
|
||||
if (i != 0)
|
||||
dev_dbg(&link->dev, "ReleaseWindow(local->amem) ret = %x\n", i);
|
||||
i = pcmcia_release_window(link, local->rmem_handle);
|
||||
if (i != 0)
|
||||
dev_dbg(&link->dev, "ReleaseWindow(local->rmem) ret = %x\n", i);
|
||||
pcmcia_disable_device(link);
|
||||
|
||||
dev_dbg(&link->dev, "ray_release ending\n");
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
|
||||
#include <net/iw_handler.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -89,13 +88,6 @@
|
|||
static int wl3501_config(struct pcmcia_device *link);
|
||||
static void wl3501_release(struct pcmcia_device *link);
|
||||
|
||||
/*
|
||||
* The dev_info variable is the "key" that is used to match up this
|
||||
* device driver with appropriate cards, through the card configuration
|
||||
* database.
|
||||
*/
|
||||
static dev_info_t wl3501_dev_info = "wl3501_cs";
|
||||
|
||||
static const struct {
|
||||
int reg_domain;
|
||||
int min, max, deflt;
|
||||
|
@ -1421,7 +1413,7 @@ static struct iw_statistics *wl3501_get_wireless_stats(struct net_device *dev)
|
|||
|
||||
static void wl3501_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
|
||||
{
|
||||
strlcpy(info->driver, wl3501_dev_info, sizeof(info->driver));
|
||||
strlcpy(info->driver, "wl3501_cs", sizeof(info->driver));
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ops = {
|
||||
|
@ -1892,9 +1884,8 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
|
|||
struct wl3501_card *this;
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
p_dev->io.NumPorts1 = 16;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = 5;
|
||||
p_dev->resource[0]->end = 16;
|
||||
p_dev->resource[0]->flags = IO_DATA_PATH_WIDTH_8;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -1940,13 +1931,14 @@ static int wl3501_config(struct pcmcia_device *link)
|
|||
/* Try allocating IO ports. This tries a few fixed addresses. If you
|
||||
* want, you can also read the card's config table to pick addresses --
|
||||
* see the serial driver for an example. */
|
||||
link->io_lines = 5;
|
||||
|
||||
for (j = 0x280; j < 0x400; j += 0x20) {
|
||||
/* The '^0x300' is so that we probe 0x300-0x3ff first, then
|
||||
* 0x200-0x2ff, and so on, because this seems safer */
|
||||
link->io.BasePort1 = j;
|
||||
link->io.BasePort2 = link->io.BasePort1 + 0x10;
|
||||
i = pcmcia_request_io(link, &link->io);
|
||||
link->resource[0]->start = j;
|
||||
link->resource[1]->start = link->resource[0]->start + 0x10;
|
||||
i = pcmcia_request_io(link);
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
|
@ -1968,7 +1960,7 @@ static int wl3501_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
if (register_netdev(dev)) {
|
||||
printk(KERN_NOTICE "wl3501_cs: register_netdev() failed\n");
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
#include <linux/parport.h>
|
||||
#include <linux/parport_pc.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -102,8 +101,8 @@ static int parport_probe(struct pcmcia_device *link)
|
|||
link->priv = info;
|
||||
info->p_dev = link;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -144,16 +143,16 @@ static int parport_config_check(struct pcmcia_device *p_dev,
|
|||
{
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
if (epp_mode)
|
||||
p_dev->conf.ConfigIndex |= FORCE_EPP_MODE;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin == 2) {
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
@ -178,12 +177,14 @@ static int parport_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2,
|
||||
p = parport_pc_probe_port(link->resource[0]->start,
|
||||
link->resource[1]->start,
|
||||
link->irq, PARPORT_DMA_NONE,
|
||||
&link->dev, IRQF_SHARED);
|
||||
if (p == NULL) {
|
||||
printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "
|
||||
"0x%3x, irq %u failed\n", link->io.BasePort1,
|
||||
"0x%3x, irq %u failed\n",
|
||||
(unsigned int) link->resource[0]->start,
|
||||
link->irq);
|
||||
goto failed;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ pcmcia_core-$(CONFIG_CARDBUS) += cardbus.o
|
|||
obj-$(CONFIG_PCCARD) += pcmcia_core.o
|
||||
|
||||
pcmcia-y += ds.o pcmcia_resource.o cistpl.o pcmcia_cis.o
|
||||
pcmcia-$(CONFIG_PCMCIA_IOCTL) += pcmcia_ioctl.o
|
||||
obj-$(CONFIG_PCMCIA) += pcmcia.o
|
||||
|
||||
pcmcia_rsrc-y += rsrc_mgr.o
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
/* include the world */
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
|
|
@ -31,11 +31,9 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/bus_ops.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <asm/byteorder.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -54,6 +53,9 @@ static const u_int exponent[] = {
|
|||
/* Upper limit on reasonable # of tuples */
|
||||
#define MAX_TUPLES 200
|
||||
|
||||
/* Bits in IRQInfo1 field */
|
||||
#define IRQ_INFO2_VALID 0x10
|
||||
|
||||
/* 16-bit CIS? */
|
||||
static int cis_width;
|
||||
module_param(cis_width, int, 0444);
|
||||
|
@ -210,7 +212,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
* Probably only useful for writing one-byte registers. Must be called
|
||||
* with ops_mutex held.
|
||||
*/
|
||||
void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
||||
int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
||||
u_int len, void *ptr)
|
||||
{
|
||||
void __iomem *sys, *end;
|
||||
|
@ -232,7 +234,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
((cis_width) ? MAP_16BIT : 0));
|
||||
if (!sys) {
|
||||
dev_dbg(&s->dev, "could not map memory\n");
|
||||
return; /* FIXME: Error */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
writeb(flags, sys+CISREG_ICTRL0);
|
||||
|
@ -257,7 +259,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
sys = set_cis_map(s, card_offset, flags);
|
||||
if (!sys) {
|
||||
dev_dbg(&s->dev, "could not map memory\n");
|
||||
return; /* FIXME: error */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
end = sys + s->map_size;
|
||||
|
@ -271,6 +273,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
|
|||
addr = 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -252,38 +251,6 @@ struct pcmcia_socket *pcmcia_get_socket_by_nr(unsigned int nr)
|
|||
}
|
||||
EXPORT_SYMBOL(pcmcia_get_socket_by_nr);
|
||||
|
||||
/*
|
||||
* The central event handler. Send_event() sends an event to the
|
||||
* 16-bit subsystem, which then calls the relevant device drivers.
|
||||
* Parse_events() interprets the event bits from
|
||||
* a card status change report. Do_shutdown() handles the high
|
||||
* priority stuff associated with a card removal.
|
||||
*/
|
||||
|
||||
/* NOTE: send_event needs to be called with skt->sem held. */
|
||||
|
||||
static int send_event(struct pcmcia_socket *s, event_t event, int priority)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if ((s->state & SOCKET_CARDBUS) && (event != CS_EVENT_CARD_REMOVAL))
|
||||
return 0;
|
||||
|
||||
dev_dbg(&s->dev, "send_event(event %d, pri %d, callback 0x%p)\n",
|
||||
event, priority, s->callback);
|
||||
|
||||
if (!s->callback)
|
||||
return 0;
|
||||
if (!try_module_get(s->callback->owner))
|
||||
return 0;
|
||||
|
||||
ret = s->callback->event(s, event, priority);
|
||||
|
||||
module_put(s->callback->owner);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int socket_reset(struct pcmcia_socket *skt)
|
||||
{
|
||||
int status, i;
|
||||
|
@ -326,7 +293,8 @@ static void socket_shutdown(struct pcmcia_socket *s)
|
|||
|
||||
dev_dbg(&s->dev, "shutdown\n");
|
||||
|
||||
send_event(s, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
|
||||
if (s->callback)
|
||||
s->callback->remove(s);
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
s->state &= SOCKET_INUSE | SOCKET_PRESENT;
|
||||
|
@ -477,7 +445,8 @@ static int socket_insert(struct pcmcia_socket *skt)
|
|||
dev_dbg(&skt->dev, "insert done\n");
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
|
||||
send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
|
||||
if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
|
||||
skt->callback->add(skt);
|
||||
} else {
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
socket_shutdown(skt);
|
||||
|
@ -494,7 +463,6 @@ static int socket_suspend(struct pcmcia_socket *skt)
|
|||
mutex_lock(&skt->ops_mutex);
|
||||
skt->suspended_state = skt->state;
|
||||
|
||||
send_event(skt, CS_EVENT_PM_SUSPEND, CS_EVENT_PRI_LOW);
|
||||
skt->socket = dead_socket;
|
||||
skt->ops->set_socket(skt, &skt->socket);
|
||||
if (skt->ops->suspend)
|
||||
|
@ -555,8 +523,8 @@ static int socket_late_resume(struct pcmcia_socket *skt)
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW);
|
||||
if (!(skt->state & SOCKET_CARDBUS) && (skt->callback))
|
||||
skt->callback->early_resume(skt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -654,16 +622,8 @@ static int pccardd(void *__skt)
|
|||
spin_unlock_irqrestore(&skt->thread_lock, flags);
|
||||
|
||||
mutex_lock(&skt->skt_mutex);
|
||||
if (events) {
|
||||
if (events & SS_DETECT)
|
||||
socket_detect_change(skt);
|
||||
if (events & SS_BATDEAD)
|
||||
send_event(skt, CS_EVENT_BATTERY_DEAD, CS_EVENT_PRI_LOW);
|
||||
if (events & SS_BATWARN)
|
||||
send_event(skt, CS_EVENT_BATTERY_LOW, CS_EVENT_PRI_LOW);
|
||||
if (events & SS_READY)
|
||||
send_event(skt, CS_EVENT_READY_CHANGE, CS_EVENT_PRI_LOW);
|
||||
}
|
||||
if (events & SS_DETECT)
|
||||
socket_detect_change(skt);
|
||||
|
||||
if (sysfs_events) {
|
||||
if (sysfs_events & PCMCIA_UEVENT_EJECT)
|
||||
|
@ -783,7 +743,7 @@ int pccard_register_pcmcia(struct pcmcia_socket *s, struct pcmcia_callback *c)
|
|||
s->callback = c;
|
||||
|
||||
if ((s->state & (SOCKET_PRESENT|SOCKET_CARDBUS)) == SOCKET_PRESENT)
|
||||
send_event(s, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW);
|
||||
s->callback->add(s);
|
||||
} else
|
||||
s->callback = NULL;
|
||||
err:
|
||||
|
@ -823,20 +783,13 @@ int pcmcia_reset_card(struct pcmcia_socket *skt)
|
|||
break;
|
||||
}
|
||||
|
||||
ret = send_event(skt, CS_EVENT_RESET_REQUEST, CS_EVENT_PRI_LOW);
|
||||
if (ret == 0) {
|
||||
send_event(skt, CS_EVENT_RESET_PHYSICAL, CS_EVENT_PRI_LOW);
|
||||
if (skt->callback)
|
||||
skt->callback->suspend(skt);
|
||||
mutex_lock(&skt->ops_mutex);
|
||||
ret = socket_reset(skt);
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
if (ret == 0) {
|
||||
send_event(skt, CS_EVENT_CARD_RESET, CS_EVENT_PRI_LOW);
|
||||
if (skt->callback)
|
||||
skt->callback->resume(skt);
|
||||
}
|
||||
}
|
||||
if (skt->callback)
|
||||
skt->callback->suspend(skt);
|
||||
mutex_lock(&skt->ops_mutex);
|
||||
ret = socket_reset(skt);
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
if ((ret == 0) && (skt->callback))
|
||||
skt->callback->resume(skt);
|
||||
|
||||
ret = 0;
|
||||
} while (0);
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
|
||||
*
|
||||
* (C) 1999 David A. Hinds
|
||||
* (C) 2003 - 2008 Dominik Brodowski
|
||||
* (C) 2003 - 2010 Dominik Brodowski
|
||||
*
|
||||
*
|
||||
* This file contains definitions _only_ needed by the PCMCIA core modules.
|
||||
|
@ -26,6 +26,9 @@
|
|||
/* Flags in client state */
|
||||
#define CLIENT_WIN_REQ(i) (0x1<<(i))
|
||||
|
||||
/* Flag to access all functions */
|
||||
#define BIND_FN_ALL 0xff
|
||||
|
||||
/* Each card function gets one of these guys */
|
||||
typedef struct config_t {
|
||||
struct kref ref;
|
||||
|
@ -35,7 +38,10 @@ typedef struct config_t {
|
|||
unsigned int ConfigBase;
|
||||
unsigned char Status, Pin, Copy, Option, ExtStatus;
|
||||
unsigned int CardValues;
|
||||
io_req_t io;
|
||||
|
||||
struct resource io[MAX_IO_WIN]; /* io ports */
|
||||
struct resource mem[MAX_WIN]; /* mem areas */
|
||||
|
||||
struct {
|
||||
u_int Attributes;
|
||||
} irq;
|
||||
|
@ -56,18 +62,11 @@ struct pccard_resource_ops {
|
|||
unsigned int attr,
|
||||
unsigned int *base,
|
||||
unsigned int num,
|
||||
unsigned int align);
|
||||
unsigned int align,
|
||||
struct resource **parent);
|
||||
struct resource* (*find_mem) (unsigned long base, unsigned long num,
|
||||
unsigned long align, int low,
|
||||
struct pcmcia_socket *s);
|
||||
int (*add_io) (struct pcmcia_socket *s,
|
||||
unsigned int action,
|
||||
unsigned long r_start,
|
||||
unsigned long r_end);
|
||||
int (*add_mem) (struct pcmcia_socket *s,
|
||||
unsigned int action,
|
||||
unsigned long r_start,
|
||||
unsigned long r_end);
|
||||
int (*init) (struct pcmcia_socket *s);
|
||||
void (*exit) (struct pcmcia_socket *s);
|
||||
};
|
||||
|
@ -114,11 +113,12 @@ void cb_free(struct pcmcia_socket *s);
|
|||
|
||||
struct pcmcia_callback{
|
||||
struct module *owner;
|
||||
int (*event) (struct pcmcia_socket *s,
|
||||
event_t event, int priority);
|
||||
int (*add) (struct pcmcia_socket *s);
|
||||
int (*remove) (struct pcmcia_socket *s);
|
||||
void (*requery) (struct pcmcia_socket *s);
|
||||
int (*validate) (struct pcmcia_socket *s, unsigned int *i);
|
||||
int (*suspend) (struct pcmcia_socket *s);
|
||||
int (*early_resume) (struct pcmcia_socket *s);
|
||||
int (*resume) (struct pcmcia_socket *s);
|
||||
};
|
||||
|
||||
|
@ -146,6 +146,8 @@ void pcmcia_put_socket(struct pcmcia_socket *skt);
|
|||
/* ds.c */
|
||||
extern struct bus_type pcmcia_bus_type;
|
||||
|
||||
struct pcmcia_device;
|
||||
|
||||
/* pcmcia_resource.c */
|
||||
extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
|
||||
extern int pcmcia_validate_mem(struct pcmcia_socket *s);
|
||||
|
@ -163,8 +165,8 @@ extern struct bin_attribute pccard_cis_attr;
|
|||
|
||||
int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr,
|
||||
u_int addr, u_int len, void *ptr);
|
||||
void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
|
||||
u_int addr, u_int len, void *ptr);
|
||||
int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr,
|
||||
u_int addr, u_int len, void *ptr);
|
||||
void release_cis_mem(struct pcmcia_socket *s);
|
||||
void destroy_cis_cache(struct pcmcia_socket *s);
|
||||
int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function,
|
||||
|
@ -188,34 +190,4 @@ int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
|
|||
|
||||
int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
|
||||
|
||||
|
||||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
/* ds.c */
|
||||
extern struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev);
|
||||
extern void pcmcia_put_dev(struct pcmcia_device *p_dev);
|
||||
|
||||
struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
|
||||
unsigned int function);
|
||||
|
||||
/* pcmcia_ioctl.c */
|
||||
extern void __init pcmcia_setup_ioctl(void);
|
||||
extern void __exit pcmcia_cleanup_ioctl(void);
|
||||
extern void handle_event(struct pcmcia_socket *s, event_t event);
|
||||
extern int handle_request(struct pcmcia_socket *s, event_t event);
|
||||
|
||||
#else /* CONFIG_PCMCIA_IOCTL */
|
||||
|
||||
static inline void __init pcmcia_setup_ioctl(void) { return; }
|
||||
static inline void __exit pcmcia_cleanup_ioctl(void) { return; }
|
||||
static inline void handle_event(struct pcmcia_socket *s, event_t event)
|
||||
{
|
||||
return;
|
||||
}
|
||||
static inline int handle_request(struct pcmcia_socket *s, event_t event)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PCMCIA_IOCTL */
|
||||
|
||||
#endif /* _LINUX_CS_INTERNAL_H */
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
|
||||
*
|
||||
* (C) 1999 David A. Hinds
|
||||
* (C) 2003 - 2006 Dominik Brodowski
|
||||
* (C) 2003 - 2010 Dominik Brodowski
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -26,7 +26,6 @@
|
|||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -213,7 +212,7 @@ EXPORT_SYMBOL(pcmcia_unregister_driver);
|
|||
|
||||
/* pcmcia_device handling */
|
||||
|
||||
struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
|
||||
static struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
|
||||
{
|
||||
struct device *tmp_dev;
|
||||
tmp_dev = get_device(&p_dev->dev);
|
||||
|
@ -222,7 +221,7 @@ struct pcmcia_device *pcmcia_get_dev(struct pcmcia_device *p_dev)
|
|||
return to_pcmcia_dev(tmp_dev);
|
||||
}
|
||||
|
||||
void pcmcia_put_dev(struct pcmcia_device *p_dev)
|
||||
static void pcmcia_put_dev(struct pcmcia_device *p_dev)
|
||||
{
|
||||
if (p_dev)
|
||||
put_device(&p_dev->dev);
|
||||
|
@ -294,7 +293,7 @@ static int pcmcia_device_probe(struct device *dev)
|
|||
}
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
if ((s->pcmcia_state.has_pfc) &&
|
||||
if ((s->pcmcia_pfc) &&
|
||||
(p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
|
||||
pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
@ -359,7 +358,7 @@ static int pcmcia_device_remove(struct device *dev)
|
|||
* pseudo multi-function card, we need to unbind
|
||||
* all devices
|
||||
*/
|
||||
if ((p_dev->socket->pcmcia_state.has_pfc) &&
|
||||
if ((p_dev->socket->pcmcia_pfc) &&
|
||||
(p_dev->socket->device_count > 0) &&
|
||||
(p_dev->device_no == 0))
|
||||
pcmcia_card_remove(p_dev->socket, p_dev);
|
||||
|
@ -477,7 +476,8 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
|
|||
}
|
||||
|
||||
|
||||
struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int function)
|
||||
static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
|
||||
unsigned int function)
|
||||
{
|
||||
struct pcmcia_device *p_dev, *tmp_dev;
|
||||
int i;
|
||||
|
@ -531,7 +531,6 @@ struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int fu
|
|||
list_for_each_entry(tmp_dev, &s->devices_list, socket_device_list)
|
||||
if (p_dev->func == tmp_dev->func) {
|
||||
p_dev->function_config = tmp_dev->function_config;
|
||||
p_dev->io = tmp_dev->io;
|
||||
p_dev->irq = tmp_dev->irq;
|
||||
kref_get(&p_dev->function_config->ref);
|
||||
}
|
||||
|
@ -544,15 +543,29 @@ struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s, unsigned int fu
|
|||
"IRQ setup failed -- device might not work\n");
|
||||
|
||||
if (!p_dev->function_config) {
|
||||
config_t *c;
|
||||
dev_dbg(&p_dev->dev, "creating config_t\n");
|
||||
p_dev->function_config = kzalloc(sizeof(struct config_t),
|
||||
GFP_KERNEL);
|
||||
if (!p_dev->function_config) {
|
||||
c = kzalloc(sizeof(struct config_t), GFP_KERNEL);
|
||||
if (!c) {
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
goto err_unreg;
|
||||
}
|
||||
kref_init(&p_dev->function_config->ref);
|
||||
p_dev->function_config = c;
|
||||
kref_init(&c->ref);
|
||||
for (i = 0; i < MAX_IO_WIN; i++) {
|
||||
c->io[i].name = p_dev->devname;
|
||||
c->io[i].flags = IORESOURCE_IO;
|
||||
}
|
||||
for (i = 0; i< MAX_WIN; i++) {
|
||||
c->mem[i].name = p_dev->devname;
|
||||
c->mem[i].flags = IORESOURCE_MEM;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MAX_IO_WIN; i++)
|
||||
p_dev->resource[i] = &p_dev->function_config->io[i];
|
||||
for (; i < (MAX_IO_WIN + MAX_WIN); i++)
|
||||
p_dev->resource[i] = &p_dev->function_config->mem[i-MAX_IO_WIN];
|
||||
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
dev_printk(KERN_NOTICE, &p_dev->dev,
|
||||
|
@ -680,7 +693,7 @@ static void pcmcia_requery(struct pcmcia_socket *s)
|
|||
* call pcmcia_device_add() -- which will fail if both
|
||||
* devices are already registered. */
|
||||
mutex_lock(&s->ops_mutex);
|
||||
has_pfc = s->pcmcia_state.has_pfc;
|
||||
has_pfc = s->pcmcia_pfc;
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
if (has_pfc)
|
||||
pcmcia_device_add(s, 0);
|
||||
|
@ -812,7 +825,7 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
|
|||
if (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) {
|
||||
dev_dbg(&dev->dev, "this is a pseudo-multi-function device\n");
|
||||
mutex_lock(&dev->socket->ops_mutex);
|
||||
dev->socket->pcmcia_state.has_pfc = 1;
|
||||
dev->socket->pcmcia_pfc = 1;
|
||||
mutex_unlock(&dev->socket->ops_mutex);
|
||||
if (dev->device_no != did->device_no)
|
||||
return 0;
|
||||
|
@ -826,7 +839,7 @@ static inline int pcmcia_devmatch(struct pcmcia_device *dev,
|
|||
|
||||
/* if this is a pseudo-multi-function device,
|
||||
* we need explicit matches */
|
||||
if (dev->socket->pcmcia_state.has_pfc)
|
||||
if (dev->socket->pcmcia_pfc)
|
||||
return 0;
|
||||
if (dev->device_no)
|
||||
return 0;
|
||||
|
@ -885,14 +898,6 @@ static int pcmcia_bus_match(struct device *dev, struct device_driver *drv)
|
|||
}
|
||||
mutex_unlock(&p_drv->dynids.lock);
|
||||
|
||||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
/* matching by cardmgr */
|
||||
if (p_dev->cardmgr == p_drv) {
|
||||
dev_dbg(dev, "cardmgr matched to %s\n", drv->name);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (did && did->match_flags) {
|
||||
dev_dbg(dev, "trying to match to %s\n", drv->name);
|
||||
if (pcmcia_devmatch(p_dev, did)) {
|
||||
|
@ -1006,6 +1011,18 @@ pcmcia_device_stringattr(prod_id2, prod_id[1]);
|
|||
pcmcia_device_stringattr(prod_id3, prod_id[2]);
|
||||
pcmcia_device_stringattr(prod_id4, prod_id[3]);
|
||||
|
||||
static ssize_t pcmcia_show_resources(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
|
||||
char *str = buf;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < PCMCIA_NUM_RESOURCES; i++)
|
||||
str += sprintf(str, "%pr\n", p_dev->resource[i]);
|
||||
|
||||
return str - buf;
|
||||
}
|
||||
|
||||
static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
|
@ -1076,6 +1093,7 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev,
|
|||
static struct device_attribute pcmcia_dev_attrs[] = {
|
||||
__ATTR(function, 0444, func_show, NULL),
|
||||
__ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state),
|
||||
__ATTR(resources, 0444, pcmcia_show_resources, NULL),
|
||||
__ATTR_RO(func_id),
|
||||
__ATTR_RO(manf_id),
|
||||
__ATTR_RO(card_id),
|
||||
|
@ -1215,86 +1233,57 @@ static int pcmcia_bus_suspend(struct pcmcia_socket *skt)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*======================================================================
|
||||
|
||||
The card status event handler.
|
||||
|
||||
======================================================================*/
|
||||
|
||||
/* Normally, the event is passed to individual drivers after
|
||||
* informing userspace. Only for CS_EVENT_CARD_REMOVAL this
|
||||
* is inversed to maintain historic compatibility.
|
||||
*/
|
||||
|
||||
static int ds_event(struct pcmcia_socket *skt, event_t event, int priority)
|
||||
static int pcmcia_bus_remove(struct pcmcia_socket *skt)
|
||||
{
|
||||
struct pcmcia_socket *s = pcmcia_get_socket(skt);
|
||||
atomic_set(&skt->present, 0);
|
||||
pcmcia_card_remove(skt, NULL);
|
||||
|
||||
if (!s) {
|
||||
dev_printk(KERN_ERR, &skt->dev,
|
||||
"PCMCIA obtaining reference to socket " \
|
||||
"failed, event 0x%x lost!\n", event);
|
||||
return -ENODEV;
|
||||
mutex_lock(&skt->ops_mutex);
|
||||
destroy_cis_cache(skt);
|
||||
pcmcia_cleanup_irq(skt);
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcmcia_bus_add(struct pcmcia_socket *skt)
|
||||
{
|
||||
atomic_set(&skt->present, 1);
|
||||
|
||||
mutex_lock(&skt->ops_mutex);
|
||||
skt->pcmcia_pfc = 0;
|
||||
destroy_cis_cache(skt); /* to be on the safe side... */
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
|
||||
pcmcia_card_add(skt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcmcia_bus_early_resume(struct pcmcia_socket *skt)
|
||||
{
|
||||
if (!verify_cis_cache(skt)) {
|
||||
pcmcia_put_socket(skt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev_dbg(&skt->dev, "ds_event(0x%06x, %d, 0x%p)\n",
|
||||
event, priority, skt);
|
||||
dev_dbg(&skt->dev, "cis mismatch - different card\n");
|
||||
|
||||
switch (event) {
|
||||
case CS_EVENT_CARD_REMOVAL:
|
||||
atomic_set(&skt->present, 0);
|
||||
pcmcia_card_remove(skt, NULL);
|
||||
handle_event(skt, event);
|
||||
mutex_lock(&s->ops_mutex);
|
||||
destroy_cis_cache(s);
|
||||
pcmcia_cleanup_irq(s);
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
break;
|
||||
/* first, remove the card */
|
||||
pcmcia_bus_remove(skt);
|
||||
|
||||
case CS_EVENT_CARD_INSERTION:
|
||||
atomic_set(&skt->present, 1);
|
||||
mutex_lock(&s->ops_mutex);
|
||||
s->pcmcia_state.has_pfc = 0;
|
||||
destroy_cis_cache(s); /* to be on the safe side... */
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
pcmcia_card_add(skt);
|
||||
handle_event(skt, event);
|
||||
break;
|
||||
mutex_lock(&skt->ops_mutex);
|
||||
destroy_cis_cache(skt);
|
||||
kfree(skt->fake_cis);
|
||||
skt->fake_cis = NULL;
|
||||
skt->functions = 0;
|
||||
mutex_unlock(&skt->ops_mutex);
|
||||
|
||||
case CS_EVENT_EJECTION_REQUEST:
|
||||
break;
|
||||
/* now, add the new card */
|
||||
pcmcia_bus_add(skt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
case CS_EVENT_PM_RESUME:
|
||||
if (verify_cis_cache(skt) != 0) {
|
||||
dev_dbg(&skt->dev, "cis mismatch - different card\n");
|
||||
/* first, remove the card */
|
||||
ds_event(skt, CS_EVENT_CARD_REMOVAL, CS_EVENT_PRI_HIGH);
|
||||
mutex_lock(&s->ops_mutex);
|
||||
destroy_cis_cache(skt);
|
||||
kfree(skt->fake_cis);
|
||||
skt->fake_cis = NULL;
|
||||
s->functions = 0;
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
/* now, add the new card */
|
||||
ds_event(skt, CS_EVENT_CARD_INSERTION,
|
||||
CS_EVENT_PRI_LOW);
|
||||
}
|
||||
handle_event(skt, event);
|
||||
break;
|
||||
|
||||
case CS_EVENT_PM_SUSPEND:
|
||||
case CS_EVENT_RESET_PHYSICAL:
|
||||
case CS_EVENT_CARD_RESET:
|
||||
default:
|
||||
handle_event(skt, event);
|
||||
break;
|
||||
}
|
||||
|
||||
pcmcia_put_socket(s);
|
||||
|
||||
return 0;
|
||||
} /* ds_event */
|
||||
|
||||
/*
|
||||
* NOTE: This is racy. There's no guarantee the card will still be
|
||||
|
@ -1323,10 +1312,12 @@ EXPORT_SYMBOL(pcmcia_dev_present);
|
|||
|
||||
static struct pcmcia_callback pcmcia_bus_callback = {
|
||||
.owner = THIS_MODULE,
|
||||
.event = ds_event,
|
||||
.add = pcmcia_bus_add,
|
||||
.remove = pcmcia_bus_remove,
|
||||
.requery = pcmcia_requery,
|
||||
.validate = pccard_validate_cis,
|
||||
.suspend = pcmcia_bus_suspend,
|
||||
.early_resume = pcmcia_bus_early_resume,
|
||||
.resume = pcmcia_bus_resume,
|
||||
};
|
||||
|
||||
|
@ -1350,11 +1341,8 @@ static int __devinit pcmcia_bus_add_socket(struct device *dev,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
init_waitqueue_head(&socket->queue);
|
||||
#endif
|
||||
INIT_LIST_HEAD(&socket->devices_list);
|
||||
memset(&socket->pcmcia_state, 0, sizeof(u8));
|
||||
socket->pcmcia_pfc = 0;
|
||||
socket->device_count = 0;
|
||||
atomic_set(&socket->present, 0);
|
||||
|
||||
|
@ -1429,8 +1417,6 @@ static int __init init_pcmcia_bus(void)
|
|||
return ret;
|
||||
}
|
||||
|
||||
pcmcia_setup_ioctl();
|
||||
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
|
||||
|
@ -1439,8 +1425,6 @@ fs_initcall(init_pcmcia_bus); /* one level after subsys_initcall so that
|
|||
|
||||
static void __exit exit_pcmcia_bus(void)
|
||||
{
|
||||
pcmcia_cleanup_ioctl();
|
||||
|
||||
class_interface_unregister(&pcmcia_bus_interface);
|
||||
|
||||
bus_unregister(&pcmcia_bus_type);
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -50,7 +50,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -59,7 +59,6 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/fs_pd.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -25,7 +25,6 @@
|
|||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -57,47 +56,23 @@ struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align,
|
|||
}
|
||||
|
||||
|
||||
/** alloc_io_space
|
||||
*
|
||||
* Special stuff for managing IO windows, because they are scarce
|
||||
*/
|
||||
|
||||
static int alloc_io_space(struct pcmcia_socket *s, u_int attr,
|
||||
unsigned int *base, unsigned int num, u_int lines)
|
||||
{
|
||||
unsigned int align;
|
||||
|
||||
align = (*base) ? (lines ? 1<<lines : 0) : 1;
|
||||
if (align && (align < num)) {
|
||||
if (*base) {
|
||||
dev_dbg(&s->dev, "odd IO request: num %#x align %#x\n",
|
||||
num, align);
|
||||
align = 0;
|
||||
} else
|
||||
while (align && (align < num))
|
||||
align <<= 1;
|
||||
}
|
||||
if (*base & ~(align-1)) {
|
||||
dev_dbg(&s->dev, "odd IO request: base %#x align %#x\n",
|
||||
*base, align);
|
||||
align = 0;
|
||||
}
|
||||
|
||||
return s->resource_ops->find_io(s, attr, base, num, align);
|
||||
} /* alloc_io_space */
|
||||
|
||||
|
||||
static void release_io_space(struct pcmcia_socket *s, unsigned int base,
|
||||
unsigned int num)
|
||||
static void release_io_space(struct pcmcia_socket *s, struct resource *res)
|
||||
{
|
||||
resource_size_t num = resource_size(res);
|
||||
int i;
|
||||
|
||||
dev_dbg(&s->dev, "release_io_space for %pR\n", res);
|
||||
|
||||
for (i = 0; i < MAX_IO_WIN; i++) {
|
||||
if (!s->io[i].res)
|
||||
continue;
|
||||
if ((s->io[i].res->start <= base) &&
|
||||
(s->io[i].res->end >= base+num-1)) {
|
||||
if ((s->io[i].res->start <= res->start) &&
|
||||
(s->io[i].res->end >= res->end)) {
|
||||
s->io[i].InUse -= num;
|
||||
if (res->parent)
|
||||
release_resource(res);
|
||||
res->start = res->end = 0;
|
||||
res->flags = IORESOURCE_IO;
|
||||
/* Free the window if no one else is using it */
|
||||
if (s->io[i].InUse == 0) {
|
||||
release_resource(s->io[i].res);
|
||||
|
@ -108,26 +83,80 @@ static void release_io_space(struct pcmcia_socket *s, unsigned int base,
|
|||
}
|
||||
} /* release_io_space */
|
||||
|
||||
|
||||
/** pccard_access_configuration_register
|
||||
/** alloc_io_space
|
||||
*
|
||||
* Access_configuration_register() reads and writes configuration
|
||||
* registers in attribute memory. Memory window 0 is reserved for
|
||||
* this and the tuple reading services.
|
||||
* Special stuff for managing IO windows, because they are scarce
|
||||
*/
|
||||
static int alloc_io_space(struct pcmcia_socket *s, struct resource *res,
|
||||
unsigned int lines)
|
||||
{
|
||||
unsigned int align;
|
||||
unsigned int base = res->start;
|
||||
unsigned int num = res->end;
|
||||
int ret;
|
||||
|
||||
int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
||||
conf_reg_t *reg)
|
||||
res->flags |= IORESOURCE_IO;
|
||||
|
||||
dev_dbg(&s->dev, "alloc_io_space request for %pR, %d lines\n",
|
||||
res, lines);
|
||||
|
||||
align = base ? (lines ? 1<<lines : 0) : 1;
|
||||
if (align && (align < num)) {
|
||||
if (base) {
|
||||
dev_dbg(&s->dev, "odd IO request\n");
|
||||
align = 0;
|
||||
} else
|
||||
while (align && (align < num))
|
||||
align <<= 1;
|
||||
}
|
||||
if (base & ~(align-1)) {
|
||||
dev_dbg(&s->dev, "odd IO request\n");
|
||||
align = 0;
|
||||
}
|
||||
|
||||
ret = s->resource_ops->find_io(s, res->flags, &base, num, align,
|
||||
&res->parent);
|
||||
if (ret) {
|
||||
dev_dbg(&s->dev, "alloc_io_space request failed (%d)\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
res->start = base;
|
||||
res->end = res->start + num - 1;
|
||||
|
||||
if (res->parent) {
|
||||
ret = request_resource(res->parent, res);
|
||||
if (ret) {
|
||||
dev_warn(&s->dev,
|
||||
"request_resource %pR failed: %d\n", res, ret);
|
||||
res->parent = NULL;
|
||||
release_io_space(s, res);
|
||||
}
|
||||
}
|
||||
dev_dbg(&s->dev, "alloc_io_space request result %d: %pR\n", ret, res);
|
||||
return ret;
|
||||
} /* alloc_io_space */
|
||||
|
||||
|
||||
/**
|
||||
* pcmcia_access_config() - read or write card configuration registers
|
||||
*
|
||||
* pcmcia_access_config() reads and writes configuration registers in
|
||||
* attribute memory. Memory window 0 is reserved for this and the tuple
|
||||
* reading services. Drivers must use pcmcia_read_config_byte() or
|
||||
* pcmcia_write_config_byte().
|
||||
*/
|
||||
static int pcmcia_access_config(struct pcmcia_device *p_dev,
|
||||
off_t where, u8 *val,
|
||||
int (*accessf) (struct pcmcia_socket *s,
|
||||
int attr, unsigned int addr,
|
||||
unsigned int len, void *ptr))
|
||||
{
|
||||
struct pcmcia_socket *s;
|
||||
config_t *c;
|
||||
int addr;
|
||||
u_char val;
|
||||
int ret = 0;
|
||||
|
||||
if (!p_dev || !p_dev->function_config)
|
||||
return -EINVAL;
|
||||
|
||||
s = p_dev->socket;
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
|
@ -139,44 +168,57 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
|||
return -EACCES;
|
||||
}
|
||||
|
||||
addr = (c->ConfigBase + reg->Offset) >> 1;
|
||||
addr = (c->ConfigBase + where) >> 1;
|
||||
|
||||
ret = accessf(s, 1, addr, 1, val);
|
||||
|
||||
switch (reg->Action) {
|
||||
case CS_READ:
|
||||
ret = pcmcia_read_cis_mem(s, 1, addr, 1, &val);
|
||||
reg->Value = val;
|
||||
break;
|
||||
case CS_WRITE:
|
||||
val = reg->Value;
|
||||
pcmcia_write_cis_mem(s, 1, addr, 1, &val);
|
||||
break;
|
||||
default:
|
||||
dev_dbg(&s->dev, "Invalid conf register request\n");
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
return ret;
|
||||
} /* pcmcia_access_configuration_register */
|
||||
EXPORT_SYMBOL(pcmcia_access_configuration_register);
|
||||
} /* pcmcia_access_config */
|
||||
|
||||
|
||||
/**
|
||||
* pcmcia_read_config_byte() - read a byte from a card configuration register
|
||||
*
|
||||
* pcmcia_read_config_byte() reads a byte from a configuration register in
|
||||
* attribute memory.
|
||||
*/
|
||||
int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val)
|
||||
{
|
||||
return pcmcia_access_config(p_dev, where, val, pcmcia_read_cis_mem);
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_read_config_byte);
|
||||
|
||||
|
||||
/**
|
||||
* pcmcia_write_config_byte() - write a byte to a card configuration register
|
||||
*
|
||||
* pcmcia_write_config_byte() writes a byte to a configuration register in
|
||||
* attribute memory.
|
||||
*/
|
||||
int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val)
|
||||
{
|
||||
return pcmcia_access_config(p_dev, where, &val, pcmcia_write_cis_mem);
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_write_config_byte);
|
||||
|
||||
|
||||
int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh,
|
||||
memreq_t *req)
|
||||
unsigned int offset)
|
||||
{
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
struct resource *res = wh;
|
||||
unsigned int w;
|
||||
int ret;
|
||||
|
||||
wh--;
|
||||
if (wh >= MAX_WIN)
|
||||
w = ((res->flags & IORESOURCE_BITS & WIN_FLAGS_REQ) >> 2) - 1;
|
||||
if (w >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
if (req->Page != 0) {
|
||||
dev_dbg(&s->dev, "failure: requested page is zero\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
s->win[wh].card_start = req->CardOffset;
|
||||
ret = s->ops->set_mem_map(s, &s->win[wh]);
|
||||
s->win[w].card_start = offset;
|
||||
ret = s->ops->set_mem_map(s, &s->win[w]);
|
||||
if (ret)
|
||||
dev_warn(&s->dev, "failed to set_mem_map\n");
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
@ -316,32 +358,26 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev)
|
|||
* don't bother checking the port ranges against the current socket
|
||||
* values.
|
||||
*/
|
||||
static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
|
||||
static int pcmcia_release_io(struct pcmcia_device *p_dev)
|
||||
{
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
int ret = -EINVAL;
|
||||
config_t *c;
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
c = p_dev->function_config;
|
||||
|
||||
if (!p_dev->_io)
|
||||
goto out;
|
||||
|
||||
c = p_dev->function_config;
|
||||
|
||||
release_io_space(s, &c->io[0]);
|
||||
|
||||
if (c->io[1].end)
|
||||
release_io_space(s, &c->io[1]);
|
||||
|
||||
p_dev->_io = 0;
|
||||
|
||||
if ((c->io.BasePort1 != req->BasePort1) ||
|
||||
(c->io.NumPorts1 != req->NumPorts1) ||
|
||||
(c->io.BasePort2 != req->BasePort2) ||
|
||||
(c->io.NumPorts2 != req->NumPorts2))
|
||||
goto out;
|
||||
|
||||
c->state &= ~CONFIG_IO_REQ;
|
||||
|
||||
release_io_space(s, req->BasePort1, req->NumPorts1);
|
||||
if (req->NumPorts2)
|
||||
release_io_space(s, req->BasePort2, req->NumPorts2);
|
||||
|
||||
out:
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
|
@ -349,19 +385,22 @@ static int pcmcia_release_io(struct pcmcia_device *p_dev, io_req_t *req)
|
|||
} /* pcmcia_release_io */
|
||||
|
||||
|
||||
int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
|
||||
int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res)
|
||||
{
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
pccard_mem_map *win;
|
||||
unsigned int w;
|
||||
|
||||
wh--;
|
||||
if (wh >= MAX_WIN)
|
||||
dev_dbg(&p_dev->dev, "releasing window %pR\n", res);
|
||||
|
||||
w = ((res->flags & IORESOURCE_BITS & WIN_FLAGS_REQ) >> 2) - 1;
|
||||
if (w >= MAX_WIN)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
win = &s->win[wh];
|
||||
win = &s->win[w];
|
||||
|
||||
if (!(p_dev->_win & CLIENT_WIN_REQ(wh))) {
|
||||
if (!(p_dev->_win & CLIENT_WIN_REQ(w))) {
|
||||
dev_dbg(&s->dev, "not releasing unknown window\n");
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
return -EINVAL;
|
||||
|
@ -370,15 +409,16 @@ int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t wh)
|
|||
/* Shut down memory window */
|
||||
win->flags &= ~MAP_ACTIVE;
|
||||
s->ops->set_mem_map(s, win);
|
||||
s->state &= ~SOCKET_WIN_REQ(wh);
|
||||
s->state &= ~SOCKET_WIN_REQ(w);
|
||||
|
||||
/* Release system memory */
|
||||
if (win->res) {
|
||||
release_resource(res);
|
||||
release_resource(win->res);
|
||||
kfree(win->res);
|
||||
win->res = NULL;
|
||||
}
|
||||
p_dev->_win &= ~CLIENT_WIN_REQ(wh);
|
||||
p_dev->_win &= ~CLIENT_WIN_REQ(w);
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
return 0;
|
||||
|
@ -473,13 +513,13 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
|
|||
pcmcia_write_cis_mem(s, 1, (base + CISREG_ESR)>>1, 1, &c->ExtStatus);
|
||||
}
|
||||
if (req->Present & PRESENT_IOBASE_0) {
|
||||
u_char b = c->io.BasePort1 & 0xff;
|
||||
u8 b = c->io[0].start & 0xff;
|
||||
pcmcia_write_cis_mem(s, 1, (base + CISREG_IOBASE_0)>>1, 1, &b);
|
||||
b = (c->io.BasePort1 >> 8) & 0xff;
|
||||
b = (c->io[0].start >> 8) & 0xff;
|
||||
pcmcia_write_cis_mem(s, 1, (base + CISREG_IOBASE_1)>>1, 1, &b);
|
||||
}
|
||||
if (req->Present & PRESENT_IOSIZE) {
|
||||
u_char b = c->io.NumPorts1 + c->io.NumPorts2 - 1;
|
||||
u8 b = resource_size(&c->io[0]) + resource_size(&c->io[1]) - 1;
|
||||
pcmcia_write_cis_mem(s, 1, (base + CISREG_IOSIZE)>>1, 1, &b);
|
||||
}
|
||||
|
||||
|
@ -513,28 +553,29 @@ int pcmcia_request_configuration(struct pcmcia_device *p_dev,
|
|||
EXPORT_SYMBOL(pcmcia_request_configuration);
|
||||
|
||||
|
||||
/** pcmcia_request_io
|
||||
/**
|
||||
* pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices
|
||||
*
|
||||
* Request_io() reserves ranges of port addresses for a socket.
|
||||
* I have not implemented range sharing or alias addressing.
|
||||
* pcmcia_request_io() attepts to reserve the IO port ranges specified in
|
||||
* &struct pcmcia_device @p_dev->resource[0] and @p_dev->resource[1]. The
|
||||
* "start" value is the requested start of the IO port resource; "end"
|
||||
* reflects the number of ports requested. The number of IO lines requested
|
||||
* is specified in &struct pcmcia_device @p_dev->io_lines.
|
||||
*/
|
||||
int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
|
||||
int pcmcia_request_io(struct pcmcia_device *p_dev)
|
||||
{
|
||||
struct pcmcia_socket *s = p_dev->socket;
|
||||
config_t *c;
|
||||
config_t *c = p_dev->function_config;
|
||||
int ret = -EINVAL;
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
dev_dbg(&s->dev, "pcmcia_request_io: %pR , %pR", &c->io[0], &c->io[1]);
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
dev_dbg(&s->dev, "pcmcia_request_io: No card present\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!req)
|
||||
goto out;
|
||||
|
||||
c = p_dev->function_config;
|
||||
if (c->state & CONFIG_LOCKED) {
|
||||
dev_dbg(&s->dev, "Configuration is locked\n");
|
||||
goto out;
|
||||
|
@ -543,40 +584,25 @@ int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req)
|
|||
dev_dbg(&s->dev, "IO already configured\n");
|
||||
goto out;
|
||||
}
|
||||
if (req->Attributes1 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS)) {
|
||||
dev_dbg(&s->dev, "bad attribute setting for IO region 1\n");
|
||||
goto out;
|
||||
}
|
||||
if ((req->NumPorts2 > 0) &&
|
||||
(req->Attributes2 & (IO_SHARED | IO_FORCE_ALIAS_ACCESS))) {
|
||||
dev_dbg(&s->dev, "bad attribute setting for IO region 2\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
dev_dbg(&s->dev, "trying to allocate resource 1\n");
|
||||
ret = alloc_io_space(s, req->Attributes1, &req->BasePort1,
|
||||
req->NumPorts1, req->IOAddrLines);
|
||||
if (ret) {
|
||||
dev_dbg(&s->dev, "allocation of resource 1 failed\n");
|
||||
ret = alloc_io_space(s, &c->io[0], p_dev->io_lines);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (req->NumPorts2) {
|
||||
dev_dbg(&s->dev, "trying to allocate resource 2\n");
|
||||
ret = alloc_io_space(s, req->Attributes2, &req->BasePort2,
|
||||
req->NumPorts2, req->IOAddrLines);
|
||||
if (c->io[1].end) {
|
||||
ret = alloc_io_space(s, &c->io[1], p_dev->io_lines);
|
||||
if (ret) {
|
||||
dev_dbg(&s->dev, "allocation of resource 2 failed\n");
|
||||
release_io_space(s, req->BasePort1, req->NumPorts1);
|
||||
release_io_space(s, &c->io[0]);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
} else
|
||||
c->io[1].start = 0;
|
||||
|
||||
c->io = *req;
|
||||
c->state |= CONFIG_IO_REQ;
|
||||
p_dev->_io = 1;
|
||||
dev_dbg(&s->dev, "allocating resources succeeded: %d\n", ret);
|
||||
|
||||
dev_dbg(&s->dev, "pcmcia_request_io succeeded: %pR , %pR",
|
||||
&c->io[0], &c->io[1]);
|
||||
out:
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
|
@ -651,7 +677,7 @@ EXPORT_SYMBOL(__pcmcia_request_exclusive_irq);
|
|||
#ifdef CONFIG_PCMCIA_PROBE
|
||||
|
||||
/* mask of IRQs already reserved by other cards, we should avoid using them */
|
||||
static u8 pcmcia_used_irq[NR_IRQS];
|
||||
static u8 pcmcia_used_irq[32];
|
||||
|
||||
static irqreturn_t test_action(int cpl, void *dev_id)
|
||||
{
|
||||
|
@ -674,6 +700,9 @@ static int pcmcia_setup_isa_irq(struct pcmcia_device *p_dev, int type)
|
|||
for (try = 0; try < 64; try++) {
|
||||
irq = try % 32;
|
||||
|
||||
if (irq > NR_IRQS)
|
||||
continue;
|
||||
|
||||
/* marked as available by driver, not blocked by userspace? */
|
||||
if (!((mask >> irq) & 1))
|
||||
continue;
|
||||
|
@ -767,23 +796,18 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
|||
struct pcmcia_socket *s = p_dev->socket;
|
||||
pccard_mem_map *win;
|
||||
u_long align;
|
||||
struct resource *res;
|
||||
int w;
|
||||
|
||||
if (!(s->state & SOCKET_PRESENT)) {
|
||||
dev_dbg(&s->dev, "No card present\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (req->Attributes & (WIN_PAGED | WIN_SHARED)) {
|
||||
dev_dbg(&s->dev, "bad attribute setting for iomem region\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Window size defaults to smallest available */
|
||||
if (req->Size == 0)
|
||||
req->Size = s->map_size;
|
||||
align = (((s->features & SS_CAP_MEM_ALIGN) ||
|
||||
(req->Attributes & WIN_STRICT_ALIGN)) ?
|
||||
req->Size : s->map_size);
|
||||
align = (s->features & SS_CAP_MEM_ALIGN) ? req->Size : s->map_size;
|
||||
if (req->Size & (s->map_size-1)) {
|
||||
dev_dbg(&s->dev, "invalid map size\n");
|
||||
return -EINVAL;
|
||||
|
@ -797,20 +821,21 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
|||
align = 0;
|
||||
|
||||
/* Allocate system memory window */
|
||||
mutex_lock(&s->ops_mutex);
|
||||
for (w = 0; w < MAX_WIN; w++)
|
||||
if (!(s->state & SOCKET_WIN_REQ(w)))
|
||||
break;
|
||||
if (w == MAX_WIN) {
|
||||
dev_dbg(&s->dev, "all windows are used already\n");
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
win = &s->win[w];
|
||||
|
||||
if (!(s->features & SS_CAP_STATIC_MAP)) {
|
||||
win->res = pcmcia_find_mem_region(req->Base, req->Size, align,
|
||||
(req->Attributes & WIN_MAP_BELOW_1MB), s);
|
||||
0, s);
|
||||
if (!win->res) {
|
||||
dev_dbg(&s->dev, "allocating mem region failed\n");
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
@ -821,16 +846,8 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
|||
|
||||
/* Configure the socket controller */
|
||||
win->map = w+1;
|
||||
win->flags = 0;
|
||||
win->flags = req->Attributes;
|
||||
win->speed = req->AccessSpeed;
|
||||
if (req->Attributes & WIN_MEMORY_TYPE)
|
||||
win->flags |= MAP_ATTRIB;
|
||||
if (req->Attributes & WIN_ENABLE)
|
||||
win->flags |= MAP_ACTIVE;
|
||||
if (req->Attributes & WIN_DATA_WIDTH_16)
|
||||
win->flags |= MAP_16BIT;
|
||||
if (req->Attributes & WIN_USE_WAIT)
|
||||
win->flags |= MAP_USE_WAIT;
|
||||
win->card_start = 0;
|
||||
|
||||
if (s->ops->set_mem_map(s, win) != 0) {
|
||||
|
@ -846,8 +863,21 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req, window_ha
|
|||
else
|
||||
req->Base = win->res->start;
|
||||
|
||||
/* convert to new-style resources */
|
||||
res = p_dev->resource[w + MAX_IO_WIN];
|
||||
res->start = req->Base;
|
||||
res->end = req->Base + req->Size - 1;
|
||||
res->flags &= ~IORESOURCE_BITS;
|
||||
res->flags |= (req->Attributes & WIN_FLAGS_MAP) | (win->map << 2);
|
||||
res->flags |= IORESOURCE_MEM;
|
||||
res->parent = win->res;
|
||||
if (win->res)
|
||||
request_resource(&iomem_resource, res);
|
||||
|
||||
dev_dbg(&s->dev, "request_window results in %pR\n", res);
|
||||
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
*wh = w + 1;
|
||||
*wh = res;
|
||||
|
||||
return 0;
|
||||
} /* pcmcia_request_window */
|
||||
|
@ -855,13 +885,18 @@ EXPORT_SYMBOL(pcmcia_request_window);
|
|||
|
||||
void pcmcia_disable_device(struct pcmcia_device *p_dev)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAX_WIN; i++) {
|
||||
struct resource *res = p_dev->resource[MAX_IO_WIN + i];
|
||||
if (res->flags & WIN_FLAGS_REQ)
|
||||
pcmcia_release_window(p_dev, res);
|
||||
}
|
||||
|
||||
pcmcia_release_configuration(p_dev);
|
||||
pcmcia_release_io(p_dev, &p_dev->io);
|
||||
pcmcia_release_io(p_dev);
|
||||
if (p_dev->_irq) {
|
||||
free_irq(p_dev->irq, p_dev->priv);
|
||||
p_dev->_irq = 0;
|
||||
}
|
||||
if (p_dev->win)
|
||||
pcmcia_release_window(p_dev, p_dev->win);
|
||||
}
|
||||
EXPORT_SYMBOL(pcmcia_disable_device);
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <mach/pxa2xx-regs.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -88,7 +87,7 @@ static struct resource *__iodyn_find_io_region(struct pcmcia_socket *s,
|
|||
|
||||
static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
|
||||
unsigned int *base, unsigned int num,
|
||||
unsigned int align)
|
||||
unsigned int align, struct resource **parent)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
|
@ -129,6 +128,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
((res->flags & ~IORESOURCE_BITS) |
|
||||
(attr & IORESOURCE_BITS));
|
||||
s->io[i].InUse = num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -140,6 +140,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
continue;
|
||||
*base = try;
|
||||
s->io[i].InUse += num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -152,6 +153,7 @@ static int iodyn_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
continue;
|
||||
*base = try;
|
||||
s->io[i].InUse += num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -164,8 +166,6 @@ struct pccard_resource_ops pccard_iodyn_ops = {
|
|||
.validate_mem = NULL,
|
||||
.find_io = iodyn_find_io,
|
||||
.find_mem = NULL,
|
||||
.add_io = NULL,
|
||||
.add_mem = NULL,
|
||||
.init = static_init,
|
||||
.exit = NULL,
|
||||
};
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -48,11 +47,12 @@ struct resource *pcmcia_make_resource(unsigned long start, unsigned long end,
|
|||
|
||||
static int static_find_io(struct pcmcia_socket *s, unsigned int attr,
|
||||
unsigned int *base, unsigned int num,
|
||||
unsigned int align)
|
||||
unsigned int align, struct resource **parent)
|
||||
{
|
||||
if (!s->io_offset)
|
||||
return -EINVAL;
|
||||
*base = s->io_offset | (*base & 0x0fff);
|
||||
*parent = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -62,8 +62,6 @@ struct pccard_resource_ops pccard_static_ops = {
|
|||
.validate_mem = NULL,
|
||||
.find_io = static_find_io,
|
||||
.find_mem = NULL,
|
||||
.add_io = NULL,
|
||||
.add_mem = NULL,
|
||||
.init = static_init,
|
||||
.exit = NULL,
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
@ -64,6 +63,9 @@ struct socket_data {
|
|||
#define MEM_PROBE_LOW (1 << 0)
|
||||
#define MEM_PROBE_HIGH (1 << 1)
|
||||
|
||||
/* Action field */
|
||||
#define REMOVE_MANAGED_RESOURCE 1
|
||||
#define ADD_MANAGED_RESOURCE 2
|
||||
|
||||
/*======================================================================
|
||||
|
||||
|
@ -716,7 +718,7 @@ static struct resource *__nonstatic_find_io_region(struct pcmcia_socket *s,
|
|||
|
||||
static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
|
||||
unsigned int *base, unsigned int num,
|
||||
unsigned int align)
|
||||
unsigned int align, struct resource **parent)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
|
@ -758,6 +760,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
((res->flags & ~IORESOURCE_BITS) |
|
||||
(attr & IORESOURCE_BITS));
|
||||
s->io[i].InUse = num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -773,6 +776,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
continue;
|
||||
*base = try;
|
||||
s->io[i].InUse += num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -791,6 +795,7 @@ static int nonstatic_find_io(struct pcmcia_socket *s, unsigned int attr,
|
|||
continue;
|
||||
*base = try;
|
||||
s->io[i].InUse += num;
|
||||
*parent = res;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -1055,8 +1060,6 @@ struct pccard_resource_ops pccard_nonstatic_ops = {
|
|||
.validate_mem = pcmcia_nonstatic_validate_mem,
|
||||
.find_io = nonstatic_find_io,
|
||||
.find_mem = nonstatic_find_mem_region,
|
||||
.add_io = adjust_io,
|
||||
.add_mem = adjust_memory,
|
||||
.init = nonstatic_init,
|
||||
.exit = nonstatic_release_resource_db,
|
||||
};
|
||||
|
@ -1115,8 +1118,6 @@ static ssize_t store_io_db(struct device *dev,
|
|||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
ret = adjust_io(s, add, start_addr, end_addr);
|
||||
if (!ret)
|
||||
s->resource_setup_new = 1;
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
return ret ? ret : count;
|
||||
|
@ -1183,8 +1184,6 @@ static ssize_t store_mem_db(struct device *dev,
|
|||
|
||||
mutex_lock(&s->ops_mutex);
|
||||
ret = adjust_memory(s, add, start_addr, end_addr);
|
||||
if (!ret)
|
||||
s->resource_setup_new = 1;
|
||||
mutex_unlock(&s->ops_mutex);
|
||||
|
||||
return ret ? ret : count;
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
/* include the world */
|
||||
#include <linux/cpufreq.h>
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include "tcic.h"
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#include <scsi/scsi_host.h>
|
||||
#include "aha152x.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -101,9 +100,8 @@ static int aha152x_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.NumPorts1 = 0x20;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 10;
|
||||
link->resource[0]->end = 0x20;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
@ -131,15 +129,16 @@ static int aha152x_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io_lines = 10;
|
||||
/* For New Media T&J, look for a SCSI window */
|
||||
if (cfg->io.win[0].len >= 0x20)
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
else if ((cfg->io.nwin > 1) &&
|
||||
(cfg->io.win[1].len >= 0x20))
|
||||
p_dev->io.BasePort1 = cfg->io.win[1].base;
|
||||
p_dev->resource[0]->start = cfg->io.win[1].base;
|
||||
if ((cfg->io.nwin > 0) &&
|
||||
(p_dev->io.BasePort1 < 0xffff)) {
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
(p_dev->resource[0]->start < 0xffff)) {
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
|
@ -168,7 +167,7 @@ static int aha152x_config_cs(struct pcmcia_device *link)
|
|||
/* Set configuration options for the aha152x driver */
|
||||
memset(&s, 0, sizeof(s));
|
||||
s.conf = "PCMCIA setup";
|
||||
s.io_port = link->io.BasePort1;
|
||||
s.io_port = link->resource[0]->start;
|
||||
s.irq = link->irq;
|
||||
s.scsiid = host_id;
|
||||
s.reconnect = reconnect;
|
||||
|
|
|
@ -46,7 +46,6 @@
|
|||
#include <scsi/scsi_host.h>
|
||||
#include "fdomain.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -84,9 +83,8 @@ static int fdomain_probe(struct pcmcia_device *link)
|
|||
|
||||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
link->io.NumPorts1 = 0x10;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 10;
|
||||
link->resource[0]->end = 0x10;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
@ -113,8 +111,9 @@ static int fdomain_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->io_lines = 10;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
|
||||
|
@ -138,10 +137,10 @@ static int fdomain_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
/* A bad hack... */
|
||||
release_region(link->io.BasePort1, link->io.NumPorts1);
|
||||
release_region(link->resource[0]->start, resource_size(link->resource[0]));
|
||||
|
||||
/* Set configuration options for the fdomain driver */
|
||||
sprintf(str, "%d,%d", link->io.BasePort1, link->irq);
|
||||
sprintf(str, "%d,%d", (unsigned int) link->resource[0]->start, link->irq);
|
||||
fdomain_setup(str);
|
||||
|
||||
host = __fdomain_16x0_detect(&fdomain_driver_template);
|
||||
|
|
|
@ -47,7 +47,6 @@
|
|||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_ioctl.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -1559,9 +1558,8 @@ static int nsp_cs_probe(struct pcmcia_device *link)
|
|||
nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info);
|
||||
|
||||
/* The io structure describes IO port mapping */
|
||||
link->io.NumPorts1 = 0x10;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 10; /* not used */
|
||||
link->resource[0]->end = 0x10;
|
||||
link->resource[0]->flags = IO_DATA_PATH_WIDTH_AUTO;
|
||||
|
||||
/* General socket configuration */
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
|
@ -1642,29 +1640,27 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags =
|
||||
p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
goto next_entry;
|
||||
}
|
||||
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
memreq_t map;
|
||||
cistpl_mem_t *mem =
|
||||
(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
|
||||
|
@ -1676,8 +1672,8 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
|
|||
cfg_mem->req.AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, &cfg_mem->req, &p_dev->win) != 0)
|
||||
goto next_entry;
|
||||
map.Page = 0; map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win,
|
||||
mem->win[0].card_addr) != 0)
|
||||
goto next_entry;
|
||||
|
||||
cfg_mem->data->MmioAddress = (unsigned long) ioremap_nocache(cfg_mem->req.Base, cfg_mem->req.Size);
|
||||
|
@ -1720,17 +1716,19 @@ static int nsp_cs_config(struct pcmcia_device *link)
|
|||
goto cs_failed;
|
||||
|
||||
if (free_ports) {
|
||||
if (link->io.BasePort1) {
|
||||
release_region(link->io.BasePort1, link->io.NumPorts1);
|
||||
if (link->resource[0]) {
|
||||
release_region(link->resource[0]->start,
|
||||
resource_size(link->resource[0]));
|
||||
}
|
||||
if (link->io.BasePort2) {
|
||||
release_region(link->io.BasePort2, link->io.NumPorts2);
|
||||
if (link->resource[1]) {
|
||||
release_region(link->resource[1]->start,
|
||||
resource_size(link->resource[1]));
|
||||
}
|
||||
}
|
||||
|
||||
/* Set port and IRQ */
|
||||
data->BaseAddress = link->io.BasePort1;
|
||||
data->NumAddress = link->io.NumPorts1;
|
||||
data->BaseAddress = link->resource[0]->start;
|
||||
data->NumAddress = resource_size(link->resource[0]);
|
||||
data->IrqNumber = link->irq;
|
||||
|
||||
nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d",
|
||||
|
@ -1765,13 +1763,10 @@ static int nsp_cs_config(struct pcmcia_device *link)
|
|||
if (link->conf.Attributes & CONF_ENABLE_IRQ) {
|
||||
printk(", irq %d", link->irq);
|
||||
}
|
||||
if (link->io.NumPorts1) {
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
}
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2+link->io.NumPorts2-1);
|
||||
if (link->resource[0])
|
||||
printk(", io %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", cfg_mem->req.Base,
|
||||
cfg_mem->req.Base+cfg_mem->req.Size-1);
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
#include <scsi/scsi_host.h>
|
||||
#include "../qlogicfas408.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -157,9 +156,8 @@ static int qlogic_probe(struct pcmcia_device *link)
|
|||
return -ENOMEM;
|
||||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 10;
|
||||
link->resource[0]->end = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
@ -186,13 +184,14 @@ static int qlogic_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io_lines = 10;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
|
||||
if (p_dev->io.BasePort1 == 0)
|
||||
if (p_dev->resource[0]->start == 0)
|
||||
return -ENODEV;
|
||||
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int qlogic_config(struct pcmcia_device * link)
|
||||
|
@ -216,18 +215,18 @@ static int qlogic_config(struct pcmcia_device * link)
|
|||
|
||||
if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
|
||||
/* set ATAcmd */
|
||||
outb(0xb4, link->io.BasePort1 + 0xd);
|
||||
outb(0x24, link->io.BasePort1 + 0x9);
|
||||
outb(0x04, link->io.BasePort1 + 0xd);
|
||||
outb(0xb4, link->resource[0]->start + 0xd);
|
||||
outb(0x24, link->resource[0]->start + 0x9);
|
||||
outb(0x04, link->resource[0]->start + 0xd);
|
||||
}
|
||||
|
||||
/* The KXL-810AN has a bigger IO port window */
|
||||
if (link->io.NumPorts1 == 32)
|
||||
if (resource_size(link->resource[0]) == 32)
|
||||
host = qlogic_detect(&qlogicfas_driver_template, link,
|
||||
link->io.BasePort1 + 16, link->irq);
|
||||
link->resource[0]->start + 16, link->irq);
|
||||
else
|
||||
host = qlogic_detect(&qlogicfas_driver_template, link,
|
||||
link->io.BasePort1, link->irq);
|
||||
link->resource[0]->start, link->irq);
|
||||
|
||||
if (!host) {
|
||||
printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name);
|
||||
|
@ -269,9 +268,9 @@ static int qlogic_resume(struct pcmcia_device *link)
|
|||
if ((info->manf_id == MANFID_MACNICA) ||
|
||||
(info->manf_id == MANFID_PIONEER) ||
|
||||
(info->manf_id == 0x0098)) {
|
||||
outb(0x80, link->io.BasePort1 + 0xd);
|
||||
outb(0x24, link->io.BasePort1 + 0x9);
|
||||
outb(0x04, link->io.BasePort1 + 0xd);
|
||||
outb(0x80, link->resource[0]->start + 0xd);
|
||||
outb(0x24, link->resource[0]->start + 0x9);
|
||||
outb(0x04, link->resource[0]->start + 0xd);
|
||||
}
|
||||
/* Ugggglllyyyy!!! */
|
||||
qlogicfas408_bus_reset(NULL);
|
||||
|
|
|
@ -71,7 +71,6 @@
|
|||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -691,13 +690,14 @@ static int SYM53C500_config_check(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
p_dev->io.BasePort1 = cfg->io.win[0].base;
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io_lines = 10;
|
||||
p_dev->resource[0]->start = cfg->io.win[0].base;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
|
||||
if (p_dev->io.BasePort1 == 0)
|
||||
if (p_dev->resource[0]->start == 0)
|
||||
return -ENODEV;
|
||||
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -734,9 +734,9 @@ SYM53C500_config(struct pcmcia_device *link)
|
|||
(info->manf_id == MANFID_PIONEER) ||
|
||||
(info->manf_id == 0x0098)) {
|
||||
/* set ATAcmd */
|
||||
outb(0xb4, link->io.BasePort1 + 0xd);
|
||||
outb(0x24, link->io.BasePort1 + 0x9);
|
||||
outb(0x04, link->io.BasePort1 + 0xd);
|
||||
outb(0xb4, link->resource[0]->start + 0xd);
|
||||
outb(0x24, link->resource[0]->start + 0x9);
|
||||
outb(0x04, link->resource[0]->start + 0xd);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -749,7 +749,7 @@ SYM53C500_config(struct pcmcia_device *link)
|
|||
* 0x130, 0x230, 0x280, 0x290,
|
||||
* 0x320, 0x330, 0x340, 0x350
|
||||
*/
|
||||
port_base = link->io.BasePort1;
|
||||
port_base = link->resource[0]->start;
|
||||
irq_level = link->irq;
|
||||
|
||||
DEB(printk("SYM53C500: port_base=0x%x, irq=%d, fast_pio=%d\n",
|
||||
|
@ -822,15 +822,15 @@ static int sym53c500_resume(struct pcmcia_device *link)
|
|||
if ((info->manf_id == MANFID_MACNICA) ||
|
||||
(info->manf_id == MANFID_PIONEER) ||
|
||||
(info->manf_id == 0x0098)) {
|
||||
outb(0x80, link->io.BasePort1 + 0xd);
|
||||
outb(0x24, link->io.BasePort1 + 0x9);
|
||||
outb(0x04, link->io.BasePort1 + 0xd);
|
||||
outb(0x80, link->resource[0]->start + 0xd);
|
||||
outb(0x24, link->resource[0]->start + 0x9);
|
||||
outb(0x04, link->resource[0]->start + 0xd);
|
||||
}
|
||||
/*
|
||||
* If things don't work after a "resume",
|
||||
* this is a good place to start looking.
|
||||
*/
|
||||
SYM53C500_int_host_reset(link->io.BasePort1);
|
||||
SYM53C500_int_host_reset(link->resource[0]->start);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -859,9 +859,8 @@ SYM53C500_probe(struct pcmcia_device *link)
|
|||
return -ENOMEM;
|
||||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.IOAddrLines = 10;
|
||||
link->resource[0]->end = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -115,16 +114,14 @@ static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_
|
|||
|
||||
static int quirk_post_ibm(struct pcmcia_device *link)
|
||||
{
|
||||
conf_reg_t reg = { 0, CS_READ, 0x800, 0 };
|
||||
u8 val;
|
||||
int ret;
|
||||
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_read_config_byte(link, 0x800, &val);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Value = reg.Value | 1;
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
ret = pcmcia_write_config_byte(link, 0x800, val | 1);
|
||||
if (ret)
|
||||
goto failed;
|
||||
return 0;
|
||||
|
@ -338,8 +335,8 @@ static int serial_probe(struct pcmcia_device *link)
|
|||
info->p_dev = link;
|
||||
link->priv = info;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
link->resource[0]->end = 8;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
if (do_sound) {
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
|
@ -427,12 +424,13 @@ static int simple_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Vpp =
|
||||
cf->vpp1.param[CISTPL_POWER_VNOM] / 10000;
|
||||
|
||||
p_dev->io_lines = ((*try & 0x1) == 0) ?
|
||||
16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)])
|
||||
&& (cf->io.win[0].base != 0)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ?
|
||||
16 : cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
|
@ -449,9 +447,9 @@ static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
|
|||
|
||||
if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) {
|
||||
for (j = 0; j < 5; j++) {
|
||||
p_dev->io.BasePort1 = base[j];
|
||||
p_dev->io.IOAddrLines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
p_dev->resource[0]->start = base[j];
|
||||
p_dev->io_lines = base[j] ? 16 : 3;
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -466,13 +464,13 @@ static int simple_config(struct pcmcia_device *link)
|
|||
/* If the card is already configured, look up the port and irq */
|
||||
if (link->function_config) {
|
||||
unsigned int port = 0;
|
||||
if ((link->io.BasePort2 != 0) &&
|
||||
(link->io.NumPorts2 == 8)) {
|
||||
port = link->io.BasePort2;
|
||||
if ((link->resource[1]->end != 0) &&
|
||||
(resource_size(link->resource[1]) == 8)) {
|
||||
port = link->resource[1]->end;
|
||||
info->slave = 1;
|
||||
} else if ((info->manfid == MANFID_OSITECH) &&
|
||||
(link->io.NumPorts1 == 0x40)) {
|
||||
port = link->io.BasePort1 + 0x28;
|
||||
(resource_size(link->resource[0]) == 0x40)) {
|
||||
port = link->resource[0]->start + 0x28;
|
||||
info->slave = 1;
|
||||
}
|
||||
if (info->slave) {
|
||||
|
@ -510,7 +508,7 @@ static int simple_config(struct pcmcia_device *link)
|
|||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0)
|
||||
return -1;
|
||||
return setup_serial(link, info, link->io.BasePort1, link->irq);
|
||||
return setup_serial(link, info, link->resource[0]->start, link->irq);
|
||||
}
|
||||
|
||||
static int multi_config_check(struct pcmcia_device *p_dev,
|
||||
|
@ -524,10 +522,10 @@ static int multi_config_check(struct pcmcia_device *p_dev,
|
|||
/* The quad port cards have bad CIS's, so just look for a
|
||||
window larger than 8 ports and assume it will be right */
|
||||
if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io)) {
|
||||
*base2 = p_dev->io.BasePort1 + 8;
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev)) {
|
||||
*base2 = p_dev->resource[0]->start + 8;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -543,11 +541,11 @@ static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
|
|||
int *base2 = priv_data;
|
||||
|
||||
if (cf->io.nwin == 2) {
|
||||
p_dev->io.BasePort1 = cf->io.win[0].base;
|
||||
p_dev->io.BasePort2 = cf->io.win[1].base;
|
||||
p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io)) {
|
||||
*base2 = p_dev->io.BasePort2;
|
||||
p_dev->resource[0]->start = cf->io.win[0].base;
|
||||
p_dev->resource[1]->start = cf->io.win[1].base;
|
||||
p_dev->io_lines = cf->io.flags & CISTPL_IO_LINES_MASK;
|
||||
if (!pcmcia_request_io(p_dev)) {
|
||||
*base2 = p_dev->resource[1]->start;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -560,10 +558,10 @@ static int multi_config(struct pcmcia_device *link)
|
|||
int i, base2 = 0;
|
||||
|
||||
/* First, look for a generic full-sized window */
|
||||
link->io.NumPorts1 = info->multi * 8;
|
||||
link->resource[0]->end = info->multi * 8;
|
||||
if (pcmcia_loop_config(link, multi_config_check, &base2)) {
|
||||
/* If that didn't work, look for two windows */
|
||||
link->io.NumPorts1 = link->io.NumPorts2 = 8;
|
||||
link->resource[0]->end = link->resource[1]->end = 8;
|
||||
info->multi = 2;
|
||||
if (pcmcia_loop_config(link, multi_config_check_notpicky,
|
||||
&base2)) {
|
||||
|
@ -599,9 +597,9 @@ static int multi_config(struct pcmcia_device *link)
|
|||
link->conf.ConfigIndex == 3) {
|
||||
err = setup_serial(link, info, base2,
|
||||
link->irq);
|
||||
base2 = link->io.BasePort1;
|
||||
base2 = link->resource[0]->start;;
|
||||
} else {
|
||||
err = setup_serial(link, info, link->io.BasePort1,
|
||||
err = setup_serial(link, info, link->resource[0]->start,
|
||||
link->irq);
|
||||
}
|
||||
info->c950ctrl = base2;
|
||||
|
@ -616,7 +614,7 @@ static int multi_config(struct pcmcia_device *link)
|
|||
return 0;
|
||||
}
|
||||
|
||||
setup_serial(link, info, link->io.BasePort1, link->irq);
|
||||
setup_serial(link, info, link->resource[0]->start, link->irq);
|
||||
for (i = 0; i < info->multi - 1; i++)
|
||||
setup_serial(link, info, base2 + (8 * i),
|
||||
link->irq);
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/mmc/sdio_func.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/etherdevice.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ciscode.h>
|
||||
|
@ -72,14 +71,9 @@
|
|||
/* Write to a PCMCIA configuration register. */
|
||||
static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value)
|
||||
{
|
||||
conf_reg_t reg;
|
||||
int res;
|
||||
|
||||
memset(®, 0, sizeof(reg));
|
||||
reg.Offset = offset;
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Value = value;
|
||||
res = pcmcia_access_configuration_register(bus->host_pcmcia, ®);
|
||||
res = pcmcia_write_config_byte(bus->host_pcmcia, offset, value);
|
||||
if (unlikely(res != 0))
|
||||
return -EBUSY;
|
||||
|
||||
|
@ -89,16 +83,11 @@ static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value)
|
|||
/* Read from a PCMCIA configuration register. */
|
||||
static int ssb_pcmcia_cfg_read(struct ssb_bus *bus, u8 offset, u8 *value)
|
||||
{
|
||||
conf_reg_t reg;
|
||||
int res;
|
||||
|
||||
memset(®, 0, sizeof(reg));
|
||||
reg.Offset = offset;
|
||||
reg.Action = CS_READ;
|
||||
res = pcmcia_access_configuration_register(bus->host_pcmcia, ®);
|
||||
res = pcmcia_read_config_byte(bus->host_pcmcia, offset, value);
|
||||
if (unlikely(res != 0))
|
||||
return -EBUSY;
|
||||
*value = reg.Value;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -37,7 +37,6 @@ Status: experimental
|
|||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -171,7 +170,7 @@ static int das16cs_attach(struct comedi_device *dev,
|
|||
if (!link)
|
||||
return -EIO;
|
||||
|
||||
dev->iobase = link->io.BasePort1;
|
||||
dev->iobase = link->resource[0]->start;;
|
||||
printk("I/O base=0x%04lx ", dev->iobase);
|
||||
|
||||
printk("fingerprint:\n");
|
||||
|
@ -662,14 +661,6 @@ static void das16cs_pcmcia_detach(struct pcmcia_device *);
|
|||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static dev_info_t dev_info = "cb_das16_cs";
|
||||
|
||||
struct local_info_t {
|
||||
struct pcmcia_device *link;
|
||||
int stop;
|
||||
|
@ -736,24 +727,22 @@ static int das16cs_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -787,12 +776,10 @@ static void das16cs_pcmcia_config(struct pcmcia_device *link)
|
|||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %u", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
if (link->resource[0])
|
||||
printk(", io %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(", io %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -846,7 +833,7 @@ struct pcmcia_driver das16cs_driver = {
|
|||
.id_table = das16cs_id_table,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "cb_das16_cs",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -48,7 +48,6 @@ Command support does not exist, but could be added for this board.
|
|||
#include "das08.h"
|
||||
|
||||
/* pcmcia includes */
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -89,7 +88,7 @@ static int das08_cs_attach(struct comedi_device *dev,
|
|||
printk(" no pcmcia cards found\n");
|
||||
return -EIO;
|
||||
}
|
||||
iobase = link->io.BasePort1;
|
||||
iobase = link->resource[0]->start;
|
||||
} else {
|
||||
printk(" bug! board does not have PCMCIA bustype\n");
|
||||
return -EINVAL;
|
||||
|
@ -132,14 +131,6 @@ static void das08_pcmcia_detach(struct pcmcia_device *);
|
|||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static const dev_info_t dev_info = "pcm-das08";
|
||||
|
||||
struct local_info_t {
|
||||
struct pcmcia_device *link;
|
||||
int stop;
|
||||
|
@ -224,24 +215,23 @@ static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -283,12 +273,10 @@ static void das08_pcmcia_config(struct pcmcia_device *link)
|
|||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %u", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
if (link->resource[0])
|
||||
printk(", io %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -362,7 +350,7 @@ struct pcmcia_driver das08_cs_driver = {
|
|||
.id_table = das08_cs_id_table,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "pcm-das08",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ IRQ is assigned but not used.
|
|||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -377,7 +376,7 @@ static int dio700_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||
link = pcmcia_cur_dev; /* XXX hack */
|
||||
if (!link)
|
||||
return -EIO;
|
||||
iobase = link->io.BasePort1;
|
||||
iobase = link->resource[0]->start;
|
||||
#ifdef incomplete
|
||||
irq = link->irq;
|
||||
#endif
|
||||
|
@ -459,14 +458,6 @@ static void dio700_cs_detach(struct pcmcia_device *);
|
|||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static const dev_info_t dev_info = "ni_daq_700";
|
||||
|
||||
struct local_info_t {
|
||||
struct pcmcia_device *link;
|
||||
int stop;
|
||||
|
@ -555,9 +546,6 @@ static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
win_req_t *req = priv_data;
|
||||
memreq_t map;
|
||||
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -571,44 +559,25 @@ static int dio700_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
cistpl_mem_t *mem =
|
||||
(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
req->Base = mem->win[0].host_addr;
|
||||
req->Size = mem->win[0].len;
|
||||
if (req->Size < 0x1000)
|
||||
req->Size = 0x1000;
|
||||
req->AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, req, &p_dev->win))
|
||||
return -ENODEV;
|
||||
map.Page = 0;
|
||||
map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
|
||||
return -ENODEV;
|
||||
}
|
||||
/* If we got this far, we're cool! */
|
||||
return 0;
|
||||
}
|
||||
|
@ -622,7 +591,7 @@ static void dio700_config(struct pcmcia_device *link)
|
|||
|
||||
dev_dbg(&link->dev, "dio700_config\n");
|
||||
|
||||
ret = pcmcia_loop_config(link, dio700_pcmcia_config_loop, &req);
|
||||
ret = pcmcia_loop_config(link, dio700_pcmcia_config_loop, NULL);
|
||||
if (ret) {
|
||||
dev_warn(&link->dev, "no configuration found\n");
|
||||
goto failed;
|
||||
|
@ -644,15 +613,10 @@ static void dio700_config(struct pcmcia_device *link)
|
|||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", req.Base,
|
||||
req.Base + req.Size - 1);
|
||||
if (link->resource[0])
|
||||
printk(", io %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -722,7 +686,7 @@ struct pcmcia_driver dio700_cs_driver = {
|
|||
.id_table = dio700_cs_ids,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "ni_daq_700",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -48,7 +48,6 @@ the PCMCIA interface.
|
|||
|
||||
#include "8255.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -129,7 +128,7 @@ static int dio24_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||
link = pcmcia_cur_dev; /* XXX hack */
|
||||
if (!link)
|
||||
return -EIO;
|
||||
iobase = link->io.BasePort1;
|
||||
iobase = link->resource[0]->start;
|
||||
#ifdef incomplete
|
||||
irq = link->irq;
|
||||
#endif
|
||||
|
@ -211,14 +210,6 @@ static void dio24_cs_detach(struct pcmcia_device *);
|
|||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static const dev_info_t dev_info = "ni_daq_dio24";
|
||||
|
||||
struct local_info_t {
|
||||
struct pcmcia_device *link;
|
||||
int stop;
|
||||
|
@ -307,9 +298,6 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
win_req_t *req = priv_data;
|
||||
memreq_t map;
|
||||
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -323,44 +311,25 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
cistpl_mem_t *mem =
|
||||
(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
req->Base = mem->win[0].host_addr;
|
||||
req->Size = mem->win[0].len;
|
||||
if (req->Size < 0x1000)
|
||||
req->Size = 0x1000;
|
||||
req->AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, req, &p_dev->win))
|
||||
return -ENODEV;
|
||||
map.Page = 0;
|
||||
map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
|
||||
return -ENODEV;
|
||||
}
|
||||
/* If we got this far, we're cool! */
|
||||
return 0;
|
||||
}
|
||||
|
@ -368,13 +337,12 @@ static int dio24_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
static void dio24_config(struct pcmcia_device *link)
|
||||
{
|
||||
int ret;
|
||||
win_req_t req;
|
||||
|
||||
printk(KERN_INFO "ni_daq_dio24: HOLA SOY YO! - config\n");
|
||||
|
||||
dev_dbg(&link->dev, "dio24_config\n");
|
||||
|
||||
ret = pcmcia_loop_config(link, dio24_pcmcia_config_loop, &req);
|
||||
ret = pcmcia_loop_config(link, dio24_pcmcia_config_loop, NULL);
|
||||
if (ret) {
|
||||
dev_warn(&link->dev, "no configuration found\n");
|
||||
goto failed;
|
||||
|
@ -396,15 +364,10 @@ static void dio24_config(struct pcmcia_device *link)
|
|||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", req.Base,
|
||||
req.Base + req.Size - 1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -473,7 +436,7 @@ struct pcmcia_driver dio24_cs_driver = {
|
|||
.id_table = dio24_cs_ids,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "ni_daq_dio24",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -71,7 +71,6 @@ NI manuals:
|
|||
#include "comedi_fc.h"
|
||||
#include "ni_labpc.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -143,7 +142,7 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||
link = pcmcia_cur_dev; /* XXX hack */
|
||||
if (!link)
|
||||
return -EIO;
|
||||
iobase = link->io.BasePort1;
|
||||
iobase = link->resource[0]->start;
|
||||
irq = link->irq;
|
||||
break;
|
||||
default:
|
||||
|
@ -189,14 +188,6 @@ static void labpc_cs_detach(struct pcmcia_device *);
|
|||
less on other parts of the kernel.
|
||||
*/
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static const dev_info_t dev_info = "daqcard-1200";
|
||||
|
||||
struct local_info_t {
|
||||
struct pcmcia_device *link;
|
||||
int stop;
|
||||
|
@ -286,9 +277,6 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
win_req_t *req = priv_data;
|
||||
memreq_t map;
|
||||
|
||||
if (cfg->index == 0)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -302,44 +290,25 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
|
||||
if (pcmcia_request_io(p_dev) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
|
||||
cistpl_mem_t *mem =
|
||||
(cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
|
||||
req->Attributes = WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM;
|
||||
req->Attributes |= WIN_ENABLE;
|
||||
req->Base = mem->win[0].host_addr;
|
||||
req->Size = mem->win[0].len;
|
||||
if (req->Size < 0x1000)
|
||||
req->Size = 0x1000;
|
||||
req->AccessSpeed = 0;
|
||||
if (pcmcia_request_window(p_dev, req, &p_dev->win))
|
||||
return -ENODEV;
|
||||
map.Page = 0;
|
||||
map.CardOffset = mem->win[0].card_addr;
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map))
|
||||
return -ENODEV;
|
||||
}
|
||||
/* If we got this far, we're cool! */
|
||||
return 0;
|
||||
}
|
||||
|
@ -348,11 +317,10 @@ static int labpc_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
static void labpc_config(struct pcmcia_device *link)
|
||||
{
|
||||
int ret;
|
||||
win_req_t req;
|
||||
|
||||
dev_dbg(&link->dev, "labpc_config\n");
|
||||
|
||||
ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, &req);
|
||||
ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL);
|
||||
if (ret) {
|
||||
dev_warn(&link->dev, "no configuration found\n");
|
||||
goto failed;
|
||||
|
@ -374,15 +342,10 @@ static void labpc_config(struct pcmcia_device *link)
|
|||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(", irq %d", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
if (link->win)
|
||||
printk(", mem 0x%06lx-0x%06lx", req.Base,
|
||||
req.Base + req.Size - 1);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -449,7 +412,7 @@ struct pcmcia_driver labpc_cs_driver = {
|
|||
.id_table = labpc_cs_ids,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "daqcard-1200",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -48,7 +48,6 @@ See the notes in the ni_atmio.o driver.
|
|||
#include "ni_stc.h"
|
||||
#include "8255.h"
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -261,12 +260,11 @@ static void cs_release(struct pcmcia_device *link);
|
|||
static void cs_detach(struct pcmcia_device *);
|
||||
|
||||
static struct pcmcia_device *cur_dev = NULL;
|
||||
static const dev_info_t dev_info = "ni_mio_cs";
|
||||
|
||||
static int cs_attach(struct pcmcia_device *link)
|
||||
{
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
link->io.NumPorts1 = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
|
||||
link->resource[0]->end = 16;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
|
@ -311,13 +309,12 @@ static int mio_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
{
|
||||
int base, ret;
|
||||
|
||||
p_dev->io.NumPorts1 = cfg->io.win[0].len;
|
||||
p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = cfg->io.win[0].len;
|
||||
p_dev->io_lines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
for (base = 0x000; base < 0x400; base += 0x20) {
|
||||
p_dev->io.BasePort1 = base;
|
||||
ret = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
p_dev->resource[0]->start = base;
|
||||
ret = pcmcia_request_io(p_dev);
|
||||
if (!ret)
|
||||
return 0;
|
||||
}
|
||||
|
@ -356,7 +353,7 @@ static int mio_cs_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||
return -EIO;
|
||||
|
||||
dev->driver = &driver_ni_mio_cs;
|
||||
dev->iobase = link->io.BasePort1;
|
||||
dev->iobase = link->resource[0]->start;
|
||||
|
||||
irq = link->irq;
|
||||
|
||||
|
@ -450,7 +447,7 @@ struct pcmcia_driver ni_mio_cs_driver = {
|
|||
.id_table = ni_mio_cs_ids,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "ni_mio_cs",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -50,7 +50,6 @@ Devices: [Quatech] DAQP-208 (daqp), DAQP-308
|
|||
#include "../comedidev.h"
|
||||
#include <linux/semaphore.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -871,7 +870,7 @@ static int daqp_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||
}
|
||||
}
|
||||
|
||||
dev->iobase = local->link->io.BasePort1;
|
||||
dev->iobase = local->link->resource[0]->start;
|
||||
|
||||
ret = alloc_subdevices(dev, 4);
|
||||
if (ret < 0)
|
||||
|
@ -995,14 +994,6 @@ static int daqp_cs_resume(struct pcmcia_device *p_dev);
|
|||
static int daqp_cs_attach(struct pcmcia_device *);
|
||||
static void daqp_cs_detach(struct pcmcia_device *);
|
||||
|
||||
/*
|
||||
The dev_info variable is the "key" that is used to match up this
|
||||
device driver with appropriate cards, through the card configuration
|
||||
database.
|
||||
*/
|
||||
|
||||
static const dev_info_t dev_info = "quatech_daqp_cs";
|
||||
|
||||
/*======================================================================
|
||||
|
||||
daqp_cs_attach() creates an "instance" of the driver, allocating
|
||||
|
@ -1101,26 +1092,24 @@ static int daqp_pcmcia_config_loop(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
|
||||
p_dev->resource[0]->flags |=
|
||||
pcmcia_io_cfg_data_width(io->flags);
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
if (io->nwin > 1) {
|
||||
p_dev->io.Attributes2 = p_dev->io.Attributes1;
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->flags = p_dev->resource[0]->flags;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
|
||||
static void daqp_cs_config(struct pcmcia_device *link)
|
||||
|
@ -1151,13 +1140,11 @@ static void daqp_cs_config(struct pcmcia_device *link)
|
|||
/* Finally, report what we've done */
|
||||
dev_info(&link->dev, "index 0x%02x", link->conf.ConfigIndex);
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
printk(KERN_INFO ", irq %u", link->irq);
|
||||
if (link->io.NumPorts1)
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1 + link->io.NumPorts1 - 1);
|
||||
if (link->io.NumPorts2)
|
||||
printk(" & 0x%04x-0x%04x", link->io.BasePort2,
|
||||
link->io.BasePort2 + link->io.NumPorts2 - 1);
|
||||
printk(", irq %u", link->irq);
|
||||
if (link->resource[0])
|
||||
printk(" & %pR", link->resource[0]);
|
||||
if (link->resource[1])
|
||||
printk(" & %pR", link->resource[1]);
|
||||
printk("\n");
|
||||
|
||||
return;
|
||||
|
@ -1226,7 +1213,7 @@ static struct pcmcia_driver daqp_cs_driver = {
|
|||
.id_table = daqp_cs_id_table,
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = dev_info,
|
||||
.name = "quatech_daqp_cs",
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -83,7 +83,6 @@
|
|||
#include <linux/if_arp.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -146,9 +145,8 @@ static int wl_adapter_attach(struct pcmcia_device *link)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
link->io.NumPorts1 = HCF_NUM_IO_PORTS;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
link->io.IOAddrLines = 6;
|
||||
link->resource[0]->end = HCF_NUM_IO_PORTS;
|
||||
link->resource[0]->flags= IO_DATA_PATH_WIDTH_16;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 5;
|
||||
|
@ -305,8 +303,9 @@ void wl_adapter_insert(struct pcmcia_device *link)
|
|||
|
||||
/* Do we need to allocate an interrupt? */
|
||||
link->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
link->io_lines = 6;
|
||||
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret != 0)
|
||||
goto failed;
|
||||
|
||||
|
@ -319,7 +318,7 @@ void wl_adapter_insert(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
if (register_netdev(dev) != 0) {
|
||||
|
|
|
@ -69,7 +69,6 @@
|
|||
******************************************************************************/
|
||||
#include <linux/version.h>
|
||||
#ifdef BUS_PCMCIA
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include <linux/errno.h> /* error codes */
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
@ -33,9 +32,8 @@ static int ixj_probe(struct pcmcia_device *p_dev)
|
|||
{
|
||||
dev_dbg(&p_dev->dev, "ixj_attach()\n");
|
||||
/* Create new ixj device */
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = 3;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
p_dev->priv = kzalloc(sizeof(struct ixj_info_t), GFP_KERNEL);
|
||||
if (!p_dev->priv) {
|
||||
|
@ -121,13 +119,14 @@ static int ixj_config_check(struct pcmcia_device *p_dev,
|
|||
{
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
p_dev->io_lines = 3;
|
||||
if (io->nwin == 2) {
|
||||
p_dev->io.BasePort2 = io->win[1].base;
|
||||
p_dev->io.NumPorts2 = io->win[1].len;
|
||||
p_dev->resource[1]->start = io->win[1].base;
|
||||
p_dev->resource[1]->end = io->win[1].len;
|
||||
}
|
||||
if (!pcmcia_request_io(p_dev, &p_dev->io))
|
||||
if (!pcmcia_request_io(p_dev))
|
||||
return 0;
|
||||
}
|
||||
return -ENODEV;
|
||||
|
@ -151,7 +150,8 @@ static int ixj_config(struct pcmcia_device * link)
|
|||
/*
|
||||
* Register the card with the core.
|
||||
*/
|
||||
j = ixj_pcmcia_probe(link->io.BasePort1, link->io.BasePort1 + 0x10);
|
||||
j = ixj_pcmcia_probe(link->resource[0]->start,
|
||||
link->resource[0]->start + 0x10);
|
||||
|
||||
info->ndev = 1;
|
||||
ixj_get_serial(link, j);
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/cisreg.h>
|
||||
|
@ -43,8 +42,6 @@ MODULE_LICENSE("GPL");
|
|||
/* VARIABLES */
|
||||
/*====================================================================*/
|
||||
|
||||
static const char driver_name[DEV_NAME_LEN] = "sl811_cs";
|
||||
|
||||
typedef struct local_info_t {
|
||||
struct pcmcia_device *p_dev;
|
||||
} local_info_t;
|
||||
|
@ -165,16 +162,16 @@ static int sl811_cs_config_check(struct pcmcia_device *p_dev,
|
|||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
|
||||
p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
|
||||
p_dev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
|
||||
p_dev->resource[0]->start = io->win[0].base;
|
||||
p_dev->resource[0]->end = io->win[0].len;
|
||||
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
return pcmcia_request_io(p_dev);
|
||||
}
|
||||
pcmcia_disable_device(p_dev);
|
||||
return -ENODEV;
|
||||
|
@ -192,7 +189,7 @@ static int sl811_cs_config(struct pcmcia_device *link)
|
|||
goto failed;
|
||||
|
||||
/* require an IRQ and two registers */
|
||||
if (!link->io.NumPorts1 || link->io.NumPorts1 < 2)
|
||||
if (resource_size(link->resource[0]) < 2)
|
||||
goto failed;
|
||||
|
||||
if (!link->irq)
|
||||
|
@ -207,11 +204,10 @@ static int sl811_cs_config(struct pcmcia_device *link)
|
|||
if (link->conf.Vpp)
|
||||
printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
|
||||
printk(", irq %d", link->irq);
|
||||
printk(", io 0x%04x-0x%04x", link->io.BasePort1,
|
||||
link->io.BasePort1+link->io.NumPorts1-1);
|
||||
printk(", io %pR", link->resource[0]);
|
||||
printk("\n");
|
||||
|
||||
if (sl811_hc_init(parent, link->io.BasePort1, link->irq)
|
||||
if (sl811_hc_init(parent, link->resource[0]->start, link->irq)
|
||||
< 0) {
|
||||
failed:
|
||||
printk(KERN_WARNING "sl811_cs_config failed\n");
|
||||
|
@ -246,7 +242,7 @@ MODULE_DEVICE_TABLE(pcmcia, sl811_ids);
|
|||
static struct pcmcia_driver sl811_cs_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.drv = {
|
||||
.name = (char *)driver_name,
|
||||
.name = "sl811_cs",
|
||||
},
|
||||
.probe = sl811_cs_probe,
|
||||
.remove = sl811_cs_detach,
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#ifndef _LINUX_CISTPL_H
|
||||
#define _LINUX_CISTPL_H
|
||||
|
||||
typedef unsigned char cisdata_t;
|
||||
|
||||
#define CISTPL_NULL 0x00
|
||||
#define CISTPL_DEVICE 0x01
|
||||
#define CISTPL_LONGLINK_CB 0x02
|
||||
|
|
|
@ -19,44 +19,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
#endif
|
||||
|
||||
/* For AccessConfigurationRegister */
|
||||
typedef struct conf_reg_t {
|
||||
u_char Function;
|
||||
u_int Action;
|
||||
off_t Offset;
|
||||
u_int Value;
|
||||
} conf_reg_t;
|
||||
|
||||
/* Actions */
|
||||
#define CS_READ 1
|
||||
#define CS_WRITE 2
|
||||
|
||||
/* for AdjustResourceInfo */
|
||||
/* Action field */
|
||||
#define REMOVE_MANAGED_RESOURCE 1
|
||||
#define ADD_MANAGED_RESOURCE 2
|
||||
|
||||
|
||||
typedef struct event_callback_args_t {
|
||||
struct pcmcia_device *client_handle;
|
||||
void *client_data;
|
||||
} event_callback_args_t;
|
||||
|
||||
/* For CardValues field */
|
||||
#define CV_OPTION_VALUE 0x01
|
||||
#define CV_STATUS_VALUE 0x02
|
||||
#define CV_PIN_REPLACEMENT 0x04
|
||||
#define CV_COPY_VALUE 0x08
|
||||
#define CV_EXT_STATUS 0x10
|
||||
|
||||
/* For GetFirst/NextClient */
|
||||
typedef struct client_req_t {
|
||||
socket_t Socket;
|
||||
u_int Attributes;
|
||||
} client_req_t;
|
||||
|
||||
#define CLIENT_THIS_SOCKET 0x01
|
||||
|
||||
/* ModifyConfiguration */
|
||||
typedef struct modconf_t {
|
||||
u_int Attributes;
|
||||
|
@ -94,43 +56,6 @@ typedef struct config_req_t {
|
|||
#define INT_CARDBUS 0x04
|
||||
#define INT_ZOOMED_VIDEO 0x08
|
||||
|
||||
/* For RequestIO and ReleaseIO */
|
||||
typedef struct io_req_t {
|
||||
u_int BasePort1;
|
||||
u_int NumPorts1;
|
||||
u_int Attributes1;
|
||||
u_int BasePort2;
|
||||
u_int NumPorts2;
|
||||
u_int Attributes2;
|
||||
u_int IOAddrLines;
|
||||
} io_req_t;
|
||||
|
||||
/* Attributes for RequestIO and ReleaseIO */
|
||||
#define IO_SHARED 0x01
|
||||
#define IO_FIRST_SHARED 0x02
|
||||
#define IO_FORCE_ALIAS_ACCESS 0x04
|
||||
#define IO_DATA_PATH_WIDTH 0x18
|
||||
#define IO_DATA_PATH_WIDTH_8 0x00
|
||||
#define IO_DATA_PATH_WIDTH_16 0x08
|
||||
#define IO_DATA_PATH_WIDTH_AUTO 0x10
|
||||
|
||||
/* Bits in IRQInfo1 field */
|
||||
#define IRQ_NMI_ID 0x01
|
||||
#define IRQ_IOCK_ID 0x02
|
||||
#define IRQ_BERR_ID 0x04
|
||||
#define IRQ_VEND_ID 0x08
|
||||
#define IRQ_INFO2_VALID 0x10
|
||||
#define IRQ_LEVEL_ID 0x20
|
||||
#define IRQ_PULSE_ID 0x40
|
||||
#define IRQ_SHARE_ID 0x80
|
||||
|
||||
typedef struct eventmask_t {
|
||||
u_int Attributes;
|
||||
u_int EventMask;
|
||||
} eventmask_t;
|
||||
|
||||
#define CONF_EVENT_MASK_VALID 0x01
|
||||
|
||||
/* Configuration registers present */
|
||||
#define PRESENT_OPTION 0x001
|
||||
#define PRESENT_STATUS 0x002
|
||||
|
@ -143,18 +68,6 @@ typedef struct eventmask_t {
|
|||
#define PRESENT_IOBASE_3 0x100
|
||||
#define PRESENT_IOSIZE 0x200
|
||||
|
||||
/* For GetMemPage, MapMemPage */
|
||||
typedef struct memreq_t {
|
||||
u_int CardOffset;
|
||||
page_t Page;
|
||||
} memreq_t;
|
||||
|
||||
/* For ModifyWindow */
|
||||
typedef struct modwin_t {
|
||||
u_int Attributes;
|
||||
u_int AccessSpeed;
|
||||
} modwin_t;
|
||||
|
||||
/* For RequestWindow */
|
||||
typedef struct win_req_t {
|
||||
u_int Attributes;
|
||||
|
@ -164,61 +77,19 @@ typedef struct win_req_t {
|
|||
} win_req_t;
|
||||
|
||||
/* Attributes for RequestWindow */
|
||||
#define WIN_ADDR_SPACE 0x0001
|
||||
#define WIN_ADDR_SPACE_MEM 0x0000
|
||||
#define WIN_ADDR_SPACE_IO 0x0001
|
||||
#define WIN_MEMORY_TYPE 0x0002
|
||||
#define WIN_MEMORY_TYPE_CM 0x0000
|
||||
#define WIN_MEMORY_TYPE_AM 0x0002
|
||||
#define WIN_ENABLE 0x0004
|
||||
#define WIN_DATA_WIDTH 0x0018
|
||||
#define WIN_DATA_WIDTH_8 0x0000
|
||||
#define WIN_DATA_WIDTH_16 0x0008
|
||||
#define WIN_DATA_WIDTH_32 0x0010
|
||||
#define WIN_PAGED 0x0020
|
||||
#define WIN_SHARED 0x0040
|
||||
#define WIN_FIRST_SHARED 0x0080
|
||||
#define WIN_USE_WAIT 0x0100
|
||||
#define WIN_STRICT_ALIGN 0x0200
|
||||
#define WIN_MAP_BELOW_1MB 0x0400
|
||||
#define WIN_PREFETCH 0x0800
|
||||
#define WIN_CACHEABLE 0x1000
|
||||
#define WIN_BAR_MASK 0xe000
|
||||
#define WIN_BAR_SHIFT 13
|
||||
#define WIN_MEMORY_TYPE_CM 0x00 /* default */
|
||||
#define WIN_MEMORY_TYPE_AM 0x20 /* MAP_ATTRIB */
|
||||
#define WIN_DATA_WIDTH_8 0x00 /* default */
|
||||
#define WIN_DATA_WIDTH_16 0x02 /* MAP_16BIT */
|
||||
#define WIN_ENABLE 0x01 /* MAP_ACTIVE */
|
||||
#define WIN_USE_WAIT 0x40 /* MAP_USE_WAIT */
|
||||
|
||||
typedef struct error_info_t {
|
||||
int func;
|
||||
int retcode;
|
||||
} error_info_t;
|
||||
|
||||
/* Flag to bind to all functions */
|
||||
#define BIND_FN_ALL 0xff
|
||||
|
||||
/* Events */
|
||||
#define CS_EVENT_PRI_LOW 0
|
||||
#define CS_EVENT_PRI_HIGH 1
|
||||
|
||||
#define CS_EVENT_WRITE_PROTECT 0x000001
|
||||
#define CS_EVENT_CARD_LOCK 0x000002
|
||||
#define CS_EVENT_CARD_INSERTION 0x000004
|
||||
#define CS_EVENT_CARD_REMOVAL 0x000008
|
||||
#define CS_EVENT_BATTERY_DEAD 0x000010
|
||||
#define CS_EVENT_BATTERY_LOW 0x000020
|
||||
#define CS_EVENT_READY_CHANGE 0x000040
|
||||
#define CS_EVENT_CARD_DETECT 0x000080
|
||||
#define CS_EVENT_RESET_REQUEST 0x000100
|
||||
#define CS_EVENT_RESET_PHYSICAL 0x000200
|
||||
#define CS_EVENT_CARD_RESET 0x000400
|
||||
#define CS_EVENT_REGISTRATION_COMPLETE 0x000800
|
||||
#define CS_EVENT_PM_SUSPEND 0x002000
|
||||
#define CS_EVENT_PM_RESUME 0x004000
|
||||
#define CS_EVENT_INSERTION_REQUEST 0x008000
|
||||
#define CS_EVENT_EJECTION_REQUEST 0x010000
|
||||
#define CS_EVENT_MTD_REQUEST 0x020000
|
||||
#define CS_EVENT_ERASE_COMPLETE 0x040000
|
||||
#define CS_EVENT_REQUEST_ATTENTION 0x080000
|
||||
#define CS_EVENT_CB_DETECT 0x100000
|
||||
#define CS_EVENT_3VCARD 0x200000
|
||||
#define CS_EVENT_XVCARD 0x400000
|
||||
#define WIN_FLAGS_MAP 0x63 /* MAP_ATTRIB | MAP_16BIT | MAP_ACTIVE |
|
||||
MAP_USE_WAIT */
|
||||
#define WIN_FLAGS_REQ 0x1c /* mapping to socket->win[i]:
|
||||
0x04 -> 0
|
||||
0x08 -> 1
|
||||
0x0c -> 2
|
||||
0x10 -> 3 */
|
||||
|
||||
#endif /* _LINUX_CS_H */
|
||||
|
|
|
@ -1,40 +0,0 @@
|
|||
/*
|
||||
* cs_types.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* The initial developer of the original code is David A. Hinds
|
||||
* <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
|
||||
* are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
|
||||
*
|
||||
* (C) 1999 David A. Hinds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_CS_TYPES_H
|
||||
#define _LINUX_CS_TYPES_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/types.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
typedef u_short socket_t;
|
||||
typedef u_int event_t;
|
||||
typedef u_char cisdata_t;
|
||||
typedef u_short page_t;
|
||||
|
||||
typedef unsigned long window_handle_t;
|
||||
|
||||
struct region_t;
|
||||
typedef struct region_t *memory_handle_t;
|
||||
|
||||
#ifndef DEV_NAME_LEN
|
||||
#define DEV_NAME_LEN 32
|
||||
#endif
|
||||
|
||||
typedef char dev_info_t[DEV_NAME_LEN];
|
||||
|
||||
#endif /* _LINUX_CS_TYPES_H */
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/mod_devicetable.h>
|
||||
#endif
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/device_id.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
@ -37,6 +36,8 @@ struct pcmcia_device;
|
|||
struct config_t;
|
||||
struct net_device;
|
||||
|
||||
typedef struct resource *window_handle_t;
|
||||
|
||||
/* dynamic device IDs for PCMCIA device drivers. See
|
||||
* Documentation/pcmcia/driver.txt for details.
|
||||
*/
|
||||
|
@ -62,6 +63,17 @@ struct pcmcia_driver {
|
|||
int pcmcia_register_driver(struct pcmcia_driver *driver);
|
||||
void pcmcia_unregister_driver(struct pcmcia_driver *driver);
|
||||
|
||||
/* for struct resource * array embedded in struct pcmcia_device */
|
||||
enum {
|
||||
PCMCIA_IOPORT_0,
|
||||
PCMCIA_IOPORT_1,
|
||||
PCMCIA_IOMEM_0,
|
||||
PCMCIA_IOMEM_1,
|
||||
PCMCIA_IOMEM_2,
|
||||
PCMCIA_IOMEM_3,
|
||||
PCMCIA_NUM_RESOURCES,
|
||||
};
|
||||
|
||||
struct pcmcia_device {
|
||||
/* the socket and the device_no [for multifunction devices]
|
||||
uniquely define a pcmcia_device */
|
||||
|
@ -79,13 +91,14 @@ struct pcmcia_device {
|
|||
struct list_head socket_device_list;
|
||||
|
||||
/* deprecated, will be cleaned up soon */
|
||||
u_int open;
|
||||
io_req_t io;
|
||||
config_req_t conf;
|
||||
window_handle_t win;
|
||||
|
||||
/* device setup */
|
||||
unsigned int irq;
|
||||
struct resource *resource[PCMCIA_NUM_RESOURCES];
|
||||
|
||||
unsigned int io_lines; /* number of I/O lines */
|
||||
|
||||
/* Is the device suspended? */
|
||||
u16 suspended:1;
|
||||
|
@ -117,13 +130,9 @@ struct pcmcia_device {
|
|||
u64 dma_mask;
|
||||
struct device dev;
|
||||
|
||||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
/* device driver wanted by cardmgr */
|
||||
struct pcmcia_driver *cardmgr;
|
||||
#endif
|
||||
|
||||
/* data private to drivers */
|
||||
void *priv;
|
||||
unsigned int open;
|
||||
};
|
||||
|
||||
#define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev)
|
||||
|
@ -178,11 +187,11 @@ struct pcmcia_device *pcmcia_dev_present(struct pcmcia_device *p_dev);
|
|||
int pcmcia_reset_card(struct pcmcia_socket *skt);
|
||||
|
||||
/* CIS config */
|
||||
int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
|
||||
conf_reg_t *reg);
|
||||
int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val);
|
||||
int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val);
|
||||
|
||||
/* device configuration */
|
||||
int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
|
||||
int pcmcia_request_io(struct pcmcia_device *p_dev);
|
||||
|
||||
int __must_check
|
||||
__pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev,
|
||||
|
@ -204,215 +213,27 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, win_req_t *req,
|
|||
window_handle_t *wh);
|
||||
int pcmcia_release_window(struct pcmcia_device *p_dev, window_handle_t win);
|
||||
int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t win,
|
||||
memreq_t *req);
|
||||
unsigned int offset);
|
||||
|
||||
int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
|
||||
void pcmcia_disable_device(struct pcmcia_device *p_dev);
|
||||
|
||||
/* IO ports */
|
||||
#define IO_DATA_PATH_WIDTH 0x18
|
||||
#define IO_DATA_PATH_WIDTH_8 0x00
|
||||
#define IO_DATA_PATH_WIDTH_16 0x08
|
||||
#define IO_DATA_PATH_WIDTH_AUTO 0x10
|
||||
|
||||
/* convert flag found in cfgtable to data path width parameter */
|
||||
static inline int pcmcia_io_cfg_data_width(unsigned int flags)
|
||||
{
|
||||
if (!(flags & CISTPL_IO_8BIT))
|
||||
return IO_DATA_PATH_WIDTH_16;
|
||||
if (!(flags & CISTPL_IO_16BIT))
|
||||
return IO_DATA_PATH_WIDTH_8;
|
||||
return IO_DATA_PATH_WIDTH_AUTO;
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
||||
|
||||
/* Below, there are only definitions which are used by
|
||||
* - the PCMCIA ioctl
|
||||
* - deprecated PCMCIA userspace tools only
|
||||
*
|
||||
* here be dragons ... here be dragons ... here be dragons ... here be drag
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_PCMCIA_IOCTL) || !defined(__KERNEL__)
|
||||
|
||||
#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || \
|
||||
defined(__bfin__)
|
||||
/* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */
|
||||
typedef u_int ioaddr_t;
|
||||
#else
|
||||
typedef u_short ioaddr_t;
|
||||
#endif
|
||||
|
||||
/* for AdjustResourceInfo */
|
||||
typedef struct adjust_t {
|
||||
u_int Action;
|
||||
u_int Resource;
|
||||
u_int Attributes;
|
||||
union {
|
||||
struct memory {
|
||||
u_long Base;
|
||||
u_long Size;
|
||||
} memory;
|
||||
struct io {
|
||||
ioaddr_t BasePort;
|
||||
ioaddr_t NumPorts;
|
||||
u_int IOAddrLines;
|
||||
} io;
|
||||
struct irq {
|
||||
u_int IRQ;
|
||||
} irq;
|
||||
} resource;
|
||||
} adjust_t;
|
||||
|
||||
/* Action field */
|
||||
#define REMOVE_MANAGED_RESOURCE 1
|
||||
#define ADD_MANAGED_RESOURCE 2
|
||||
#define GET_FIRST_MANAGED_RESOURCE 3
|
||||
#define GET_NEXT_MANAGED_RESOURCE 4
|
||||
/* Resource field */
|
||||
#define RES_MEMORY_RANGE 1
|
||||
#define RES_IO_RANGE 2
|
||||
#define RES_IRQ 3
|
||||
/* Attribute field */
|
||||
#define RES_IRQ_TYPE 0x03
|
||||
#define RES_IRQ_TYPE_EXCLUSIVE 0
|
||||
#define RES_IRQ_TYPE_TIME 1
|
||||
#define RES_IRQ_TYPE_DYNAMIC 2
|
||||
#define RES_IRQ_CSC 0x04
|
||||
#define RES_SHARED 0x08
|
||||
#define RES_RESERVED 0x10
|
||||
#define RES_ALLOCATED 0x20
|
||||
#define RES_REMOVED 0x40
|
||||
|
||||
|
||||
typedef struct tuple_parse_t {
|
||||
tuple_t tuple;
|
||||
cisdata_t data[255];
|
||||
cisparse_t parse;
|
||||
} tuple_parse_t;
|
||||
|
||||
typedef struct win_info_t {
|
||||
window_handle_t handle;
|
||||
win_req_t window;
|
||||
memreq_t map;
|
||||
} win_info_t;
|
||||
|
||||
typedef struct bind_info_t {
|
||||
dev_info_t dev_info;
|
||||
u_char function;
|
||||
struct pcmcia_device *instance;
|
||||
char name[DEV_NAME_LEN];
|
||||
u_short major, minor;
|
||||
void *next;
|
||||
} bind_info_t;
|
||||
|
||||
typedef struct mtd_info_t {
|
||||
dev_info_t dev_info;
|
||||
u_int Attributes;
|
||||
u_int CardOffset;
|
||||
} mtd_info_t;
|
||||
|
||||
typedef struct region_info_t {
|
||||
u_int Attributes;
|
||||
u_int CardOffset;
|
||||
u_int RegionSize;
|
||||
u_int AccessSpeed;
|
||||
u_int BlockSize;
|
||||
u_int PartMultiple;
|
||||
u_char JedecMfr, JedecInfo;
|
||||
memory_handle_t next;
|
||||
} region_info_t;
|
||||
|
||||
#define REGION_TYPE 0x0001
|
||||
#define REGION_TYPE_CM 0x0000
|
||||
#define REGION_TYPE_AM 0x0001
|
||||
#define REGION_PREFETCH 0x0008
|
||||
#define REGION_CACHEABLE 0x0010
|
||||
#define REGION_BAR_MASK 0xe000
|
||||
#define REGION_BAR_SHIFT 13
|
||||
|
||||
/* For ReplaceCIS */
|
||||
typedef struct cisdump_t {
|
||||
u_int Length;
|
||||
cisdata_t Data[CISTPL_MAX_CIS_SIZE];
|
||||
} cisdump_t;
|
||||
|
||||
/* for GetConfigurationInfo */
|
||||
typedef struct config_info_t {
|
||||
u_char Function;
|
||||
u_int Attributes;
|
||||
u_int Vcc, Vpp1, Vpp2;
|
||||
u_int IntType;
|
||||
u_int ConfigBase;
|
||||
u_char Status, Pin, Copy, Option, ExtStatus;
|
||||
u_int Present;
|
||||
u_int CardValues;
|
||||
u_int AssignedIRQ;
|
||||
u_int IRQAttributes;
|
||||
ioaddr_t BasePort1;
|
||||
ioaddr_t NumPorts1;
|
||||
u_int Attributes1;
|
||||
ioaddr_t BasePort2;
|
||||
ioaddr_t NumPorts2;
|
||||
u_int Attributes2;
|
||||
u_int IOAddrLines;
|
||||
} config_info_t;
|
||||
|
||||
/* For ValidateCIS */
|
||||
typedef struct cisinfo_t {
|
||||
u_int Chains;
|
||||
} cisinfo_t;
|
||||
|
||||
typedef struct cs_status_t {
|
||||
u_char Function;
|
||||
event_t CardState;
|
||||
event_t SocketState;
|
||||
} cs_status_t;
|
||||
|
||||
typedef union ds_ioctl_arg_t {
|
||||
adjust_t adjust;
|
||||
config_info_t config;
|
||||
tuple_t tuple;
|
||||
tuple_parse_t tuple_parse;
|
||||
client_req_t client_req;
|
||||
cs_status_t status;
|
||||
conf_reg_t conf_reg;
|
||||
cisinfo_t cisinfo;
|
||||
region_info_t region;
|
||||
bind_info_t bind_info;
|
||||
mtd_info_t mtd_info;
|
||||
win_info_t win_info;
|
||||
cisdump_t cisdump;
|
||||
} ds_ioctl_arg_t;
|
||||
|
||||
#define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t)
|
||||
#define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t)
|
||||
#define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t)
|
||||
#define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t)
|
||||
#define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t)
|
||||
#define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t)
|
||||
#define DS_RESET_CARD _IO ('d', 8)
|
||||
#define DS_GET_STATUS _IOWR('d', 9, cs_status_t)
|
||||
#define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t)
|
||||
#define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t)
|
||||
#define DS_SUSPEND_CARD _IO ('d', 12)
|
||||
#define DS_RESUME_CARD _IO ('d', 13)
|
||||
#define DS_EJECT_CARD _IO ('d', 14)
|
||||
#define DS_INSERT_CARD _IO ('d', 15)
|
||||
#define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t)
|
||||
#define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t)
|
||||
#define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t)
|
||||
#define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t)
|
||||
#define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t)
|
||||
#define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t)
|
||||
|
||||
#define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t)
|
||||
#define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t)
|
||||
#define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t)
|
||||
#define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t)
|
||||
#define DS_BIND_MTD _IOWR('d', 64, mtd_info_t)
|
||||
|
||||
|
||||
/* used in userspace only */
|
||||
#define CS_IN_USE 0x1e
|
||||
|
||||
#define INFO_MASTER_CLIENT 0x01
|
||||
#define INFO_IO_CLIENT 0x02
|
||||
#define INFO_MTD_CLIENT 0x04
|
||||
#define INFO_MEM_CLIENT 0x08
|
||||
#define MAX_NUM_CLIENTS 3
|
||||
|
||||
#define INFO_CARD_SHARE 0x10
|
||||
#define INFO_CARD_EXCL 0x20
|
||||
|
||||
|
||||
#endif /* !defined(__KERNEL__) || defined(CONFIG_PCMCIA_IOCTL) */
|
||||
|
||||
#endif /* _LINUX_DS_H */
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/sched.h> /* task_struct, completion */
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#ifdef CONFIG_CARDBUS
|
||||
#include <linux/pci.h>
|
||||
|
@ -162,17 +161,10 @@ struct pcmcia_socket {
|
|||
u_int pci_irq;
|
||||
struct pci_dev *cb_dev;
|
||||
|
||||
|
||||
/* socket setup is done so resources should be able to be allocated.
|
||||
* Only if set to 1, calls to find_{io,mem}_region are handled, and
|
||||
* insertio events are actually managed by the PCMCIA layer.*/
|
||||
u8 resource_setup_done:1;
|
||||
|
||||
/* It's old if resource setup is done using adjust_resource_info() */
|
||||
u8 resource_setup_old:1;
|
||||
u8 resource_setup_new:1;
|
||||
|
||||
u8 reserved:5;
|
||||
u8 resource_setup_done;
|
||||
|
||||
/* socket operations */
|
||||
struct pccard_operations *ops;
|
||||
|
@ -218,15 +210,8 @@ struct pcmcia_socket {
|
|||
* incorrectness and change */
|
||||
u8 device_count;
|
||||
|
||||
/* 16-bit state: */
|
||||
struct {
|
||||
/* "master" ioctl is used */
|
||||
u8 busy:1;
|
||||
/* the PCMCIA card consists of two pseudo devices */
|
||||
u8 has_pfc:1;
|
||||
|
||||
u8 reserved:6;
|
||||
} pcmcia_state;
|
||||
/* does the PCMCIA card consist of two pseudo devices? */
|
||||
u8 pcmcia_pfc;
|
||||
|
||||
/* non-zero if PCMCIA card is present */
|
||||
atomic_t present;
|
||||
|
@ -234,10 +219,6 @@ struct pcmcia_socket {
|
|||
/* IRQ to be used by PCMCIA devices. May not be IRQ 0. */
|
||||
unsigned int pcmcia_irq;
|
||||
|
||||
#ifdef CONFIG_PCMCIA_IOCTL
|
||||
struct user_info_t *user;
|
||||
wait_queue_head_t queue;
|
||||
#endif /* CONFIG_PCMCIA_IOCTL */
|
||||
#endif /* CONFIG_PCMCIA */
|
||||
|
||||
/* socket device */
|
||||
|
|
|
@ -139,8 +139,8 @@ static int snd_pdacf_probe(struct pcmcia_device *link)
|
|||
pdacf->p_dev = link;
|
||||
link->priv = pdacf;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.NumPorts1 = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->resource[0]->end = 16;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -219,7 +219,7 @@ static int pdacf_config(struct pcmcia_device *link)
|
|||
snd_printdd(KERN_DEBUG "pdacf_config called\n");
|
||||
link->conf.ConfigIndex = 0x5;
|
||||
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
@ -231,7 +231,8 @@ static int pdacf_config(struct pcmcia_device *link)
|
|||
if (ret)
|
||||
goto failed;
|
||||
|
||||
if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq) < 0)
|
||||
if (snd_pdacf_assign_resources(pdacf, link->resource[0]->start,
|
||||
link->irq) < 0)
|
||||
goto failed;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <sound/pcm.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
|
@ -159,8 +159,8 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl,
|
|||
vxp->p_dev = link;
|
||||
link->priv = chip;
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.NumPorts1 = 16;
|
||||
link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->resource[0]->end = 16;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
@ -226,7 +226,7 @@ static int vxpocket_config(struct pcmcia_device *link)
|
|||
strcpy(chip->card->driver, vxp440_hw.name);
|
||||
}
|
||||
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
ret = pcmcia_request_io(link);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
|
@ -241,7 +241,8 @@ static int vxpocket_config(struct pcmcia_device *link)
|
|||
chip->dev = &link->dev;
|
||||
snd_card_set_dev(chip->card, chip->dev);
|
||||
|
||||
if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq) < 0)
|
||||
if (snd_vxpocket_assign_resources(chip, link->resource[0]->start,
|
||||
link->irq) < 0)
|
||||
goto failed;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
|
||||
#include <sound/vx_core.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
|
Loading…
Reference in a new issue