Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Conflicts: drivers/net/pcmcia/fmvj18x_cs.c drivers/net/pcmcia/nmclan_cs.c drivers/net/pcmcia/xirc2ps_cs.c drivers/net/wireless/ray_cs.c
This commit is contained in:
@@ -43,21 +43,6 @@
|
||||
|
||||
#include "airo.h"
|
||||
|
||||
/*
|
||||
All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If
|
||||
you do not define PCMCIA_DEBUG at all, all the debug code will be
|
||||
left out. If you compile with PCMCIA_DEBUG=0, the debug code will
|
||||
be present but disabled -- but it can then be enabled for specific
|
||||
modules at load time with a 'pc_debug=#' option to insmod.
|
||||
*/
|
||||
#ifdef PCMCIA_DEBUG
|
||||
static int pc_debug = PCMCIA_DEBUG;
|
||||
module_param(pc_debug, int, 0);
|
||||
static char *version = "$Revision: 1.2 $";
|
||||
#define DEBUG(n, args...) if (pc_debug > (n)) printk(KERN_DEBUG args);
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -145,11 +130,10 @@ static int airo_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "airo_attach()\n");
|
||||
dev_dbg(&p_dev->dev, "airo_attach()\n");
|
||||
|
||||
/* Interrupt setup */
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
p_dev->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
@@ -184,7 +168,7 @@ static int airo_probe(struct pcmcia_device *p_dev)
|
||||
|
||||
static void airo_detach(struct pcmcia_device *link)
|
||||
{
|
||||
DEBUG(0, "airo_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "airo_detach\n");
|
||||
|
||||
airo_release(link);
|
||||
|
||||
@@ -204,9 +188,6 @@ static void airo_detach(struct pcmcia_device *link)
|
||||
|
||||
======================================================================*/
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
static int airo_cs_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
@@ -275,11 +256,11 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
|
||||
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)
|
||||
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->win, &map) != 0)
|
||||
if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
|
||||
return -ENODEV;
|
||||
}
|
||||
/* If we got this far, we're cool! */
|
||||
@@ -291,11 +272,11 @@ static int airo_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
win_req_t *req;
|
||||
int last_fn, last_ret;
|
||||
int ret;
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
DEBUG(0, "airo_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "airo_config\n");
|
||||
|
||||
req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
|
||||
if (!req)
|
||||
@@ -315,8 +296,8 @@ static int airo_config(struct pcmcia_device *link)
|
||||
* and most client drivers will only use the CIS to fill in
|
||||
* implementation-defined details.
|
||||
*/
|
||||
last_ret = pcmcia_loop_config(link, airo_cs_config_check, req);
|
||||
if (last_ret)
|
||||
ret = pcmcia_loop_config(link, airo_cs_config_check, req);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
@@ -324,21 +305,25 @@ static int airo_config(struct pcmcia_device *link)
|
||||
handler to the interrupt, unless the 'Handler' member of the
|
||||
irq structure is initialized.
|
||||
*/
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ) {
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
This actually configures the PCMCIA socket -- setting up
|
||||
the I/O windows and the interrupt mapping, and putting the
|
||||
card and host interface into "Memory and IO" mode.
|
||||
*/
|
||||
CS_CHECK(RequestConfiguration,
|
||||
pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
((local_info_t *)link->priv)->eth_dev =
|
||||
init_airo_card(link->irq.AssignedIRQ,
|
||||
link->io.BasePort1, 1, &handle_to_dev(link));
|
||||
link->io.BasePort1, 1, &link->dev);
|
||||
if (!((local_info_t *)link->priv)->eth_dev)
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
At this point, the dev_node_t structure(s) need to be
|
||||
@@ -368,8 +353,6 @@ static int airo_config(struct pcmcia_device *link)
|
||||
kfree(req);
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
airo_release(link);
|
||||
kfree(req);
|
||||
@@ -386,7 +369,7 @@ static int airo_config(struct pcmcia_device *link)
|
||||
|
||||
static void airo_release(struct pcmcia_device *link)
|
||||
{
|
||||
DEBUG(0, "airo_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "airo_release\n");
|
||||
pcmcia_disable_device(link);
|
||||
}
|
||||
|
||||
|
@@ -55,22 +55,6 @@
|
||||
|
||||
#include "atmel.h"
|
||||
|
||||
/*
|
||||
All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If
|
||||
you do not define PCMCIA_DEBUG at all, all the debug code will be
|
||||
left out. If you compile with PCMCIA_DEBUG=0, the debug code will
|
||||
be present but disabled -- but it can then be enabled for specific
|
||||
modules at load time with a 'pc_debug=#' option to insmod.
|
||||
*/
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
static int pc_debug = PCMCIA_DEBUG;
|
||||
module_param(pc_debug, int, 0);
|
||||
static char *version = "$Revision: 1.2 $";
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -155,11 +139,10 @@ static int atmel_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "atmel_attach()\n");
|
||||
dev_dbg(&p_dev->dev, "atmel_attach()\n");
|
||||
|
||||
/* Interrupt setup */
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
p_dev->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
@@ -194,7 +177,7 @@ static int atmel_probe(struct pcmcia_device *p_dev)
|
||||
|
||||
static void atmel_detach(struct pcmcia_device *link)
|
||||
{
|
||||
DEBUG(0, "atmel_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "atmel_detach\n");
|
||||
|
||||
atmel_release(link);
|
||||
|
||||
@@ -209,9 +192,6 @@ static void atmel_detach(struct pcmcia_device *link)
|
||||
|
||||
======================================================================*/
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
/* Call-back function to interrogate PCMCIA-specific information
|
||||
about the current existance of the card */
|
||||
static int card_present(void *arg)
|
||||
@@ -275,13 +255,13 @@ static int atmel_config_check(struct pcmcia_device *p_dev,
|
||||
static int atmel_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
int last_fn, last_ret;
|
||||
int ret;
|
||||
struct pcmcia_device_id *did;
|
||||
|
||||
dev = link->priv;
|
||||
did = dev_get_drvdata(&handle_to_dev(link));
|
||||
did = dev_get_drvdata(&link->dev);
|
||||
|
||||
DEBUG(0, "atmel_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "atmel_config\n");
|
||||
|
||||
/*
|
||||
In this loop, we scan the CIS for configuration table entries,
|
||||
@@ -303,31 +283,36 @@ static int atmel_config(struct pcmcia_device *link)
|
||||
handler to the interrupt, unless the 'Handler' member of the
|
||||
irq structure is initialized.
|
||||
*/
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ)
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ) {
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
This actually configures the PCMCIA socket -- setting up
|
||||
the I/O windows and the interrupt mapping, and putting the
|
||||
card and host interface into "Memory and IO" mode.
|
||||
*/
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
if (link->irq.AssignedIRQ == 0) {
|
||||
printk(KERN_ALERT
|
||||
"atmel: cannot assign IRQ: check that CONFIG_ISA is set in kernel config.");
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
((local_info_t*)link->priv)->eth_dev =
|
||||
init_atmel_card(link->irq.AssignedIRQ,
|
||||
link->io.BasePort1,
|
||||
did ? did->driver_info : ATMEL_FW_TYPE_NONE,
|
||||
&handle_to_dev(link),
|
||||
&link->dev,
|
||||
card_present,
|
||||
link);
|
||||
if (!((local_info_t*)link->priv)->eth_dev)
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
|
||||
|
||||
/*
|
||||
@@ -340,8 +325,6 @@ static int atmel_config(struct pcmcia_device *link)
|
||||
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
atmel_release(link);
|
||||
return -ENODEV;
|
||||
@@ -359,7 +342,7 @@ static void atmel_release(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = ((local_info_t*)link->priv)->eth_dev;
|
||||
|
||||
DEBUG(0, "atmel_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "atmel_release\n");
|
||||
|
||||
if (dev)
|
||||
stop_atmel_card(dev);
|
||||
|
@@ -65,35 +65,15 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
||||
struct ssb_bus *ssb;
|
||||
win_req_t win;
|
||||
memreq_t mem;
|
||||
tuple_t tuple;
|
||||
cisparse_t parse;
|
||||
int err = -ENOMEM;
|
||||
int res = 0;
|
||||
unsigned char buf[64];
|
||||
|
||||
ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
|
||||
if (!ssb)
|
||||
goto out_error;
|
||||
|
||||
err = -ENODEV;
|
||||
tuple.DesiredTuple = CISTPL_CONFIG;
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
|
||||
res = pcmcia_get_first_tuple(dev, &tuple);
|
||||
if (res != 0)
|
||||
goto err_kfree_ssb;
|
||||
res = pcmcia_get_tuple_data(dev, &tuple);
|
||||
if (res != 0)
|
||||
goto err_kfree_ssb;
|
||||
res = pcmcia_parse_tuple(&tuple, &parse);
|
||||
if (res != 0)
|
||||
goto err_kfree_ssb;
|
||||
|
||||
dev->conf.ConfigBase = parse.config.base;
|
||||
dev->conf.Present = parse.config.rmask[0];
|
||||
dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -107,20 +87,18 @@ static int __devinit b43_pcmcia_probe(struct pcmcia_device *dev)
|
||||
win.Base = 0;
|
||||
win.Size = SSB_CORE_SIZE;
|
||||
win.AccessSpeed = 250;
|
||||
res = pcmcia_request_window(&dev, &win, &dev->win);
|
||||
res = pcmcia_request_window(dev, &win, &dev->win);
|
||||
if (res != 0)
|
||||
goto err_kfree_ssb;
|
||||
|
||||
mem.CardOffset = 0;
|
||||
mem.Page = 0;
|
||||
res = pcmcia_map_mem_page(dev->win, &mem);
|
||||
res = pcmcia_map_mem_page(dev, dev->win, &mem);
|
||||
if (res != 0)
|
||||
goto err_disable;
|
||||
|
||||
dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
dev->irq.Handler = NULL; /* The handler is registered later. */
|
||||
dev->irq.Instance = NULL;
|
||||
res = pcmcia_request_irq(dev, &dev->irq);
|
||||
if (res != 0)
|
||||
goto err_disable;
|
||||
|
@@ -274,9 +274,6 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
||||
conf_reg_t reg;
|
||||
struct hostap_interface *iface = netdev_priv(dev);
|
||||
local_info_t *local = iface->local;
|
||||
tuple_t tuple;
|
||||
cisparse_t *parse = NULL;
|
||||
u_char buf[64];
|
||||
struct hostap_cs_priv *hw_priv = local->hw_priv;
|
||||
|
||||
if (hw_priv->link->io.NumPorts1 < 0x42) {
|
||||
@@ -285,28 +282,13 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
||||
goto done;
|
||||
}
|
||||
|
||||
parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL);
|
||||
if (parse == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
tuple.Attributes = TUPLE_RETURN_COMMON;
|
||||
tuple.TupleData = buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
|
||||
if (hw_priv->link->manf_id != 0xd601 || hw_priv->link->card_id != 0x0101) {
|
||||
/* No SanDisk manfid found */
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
tuple.DesiredTuple = CISTPL_LONGLINK_MFC;
|
||||
if (pcmcia_get_first_tuple(hw_priv->link, &tuple) ||
|
||||
pcmcia_get_tuple_data(hw_priv->link, &tuple) ||
|
||||
pcmcia_parse_tuple(&tuple, parse) ||
|
||||
parse->longlink_mfc.nfn < 2) {
|
||||
if (hw_priv->link->socket->functions < 2) {
|
||||
/* No multi-function links found */
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
@@ -354,7 +336,6 @@ static int sandisk_enable_wireless(struct net_device *dev)
|
||||
udelay(10);
|
||||
|
||||
done:
|
||||
kfree(parse);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -529,10 +510,6 @@ static void prism2_detach(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
|
||||
/* run after a CARD_INSERTION event is received to configure the PCMCIA
|
||||
* socket and make the device available to the system */
|
||||
|
||||
@@ -624,7 +601,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
struct hostap_interface *iface;
|
||||
local_info_t *local;
|
||||
int ret = 1;
|
||||
int last_fn, last_ret;
|
||||
struct hostap_cs_priv *hw_priv;
|
||||
|
||||
PDEBUG(DEBUG_FLOW, "prism2_config()\n");
|
||||
@@ -636,19 +612,18 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
/* Look for an appropriate configuration table entry in the CIS */
|
||||
last_ret = pcmcia_loop_config(link, prism2_config_check, NULL);
|
||||
if (last_ret) {
|
||||
ret = pcmcia_loop_config(link, prism2_config_check, NULL);
|
||||
if (ret) {
|
||||
if (!ignore_cis_vcc)
|
||||
printk(KERN_ERR "GetNextTuple(): No matching "
|
||||
"CIS configuration. Maybe you need the "
|
||||
"ignore_cis_vcc=1 parameter.\n");
|
||||
cs_error(link, RequestIO, last_ret);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Need to allocate net_device before requesting IRQ handler */
|
||||
dev = prism2_init_local_data(&prism2_pccard_funcs, 0,
|
||||
&handle_to_dev(link));
|
||||
&link->dev);
|
||||
if (dev == NULL)
|
||||
goto failed;
|
||||
link->priv = dev;
|
||||
@@ -666,13 +641,11 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
* irq structure is initialized.
|
||||
*/
|
||||
if (link->conf.Attributes & CONF_ENABLE_IRQ) {
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING |
|
||||
IRQ_HANDLE_PRESENT;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = prism2_interrupt;
|
||||
link->irq.Instance = dev;
|
||||
CS_CHECK(RequestIRQ,
|
||||
pcmcia_request_irq(link, &link->irq));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -680,8 +653,9 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
* the I/O windows and the interrupt mapping, and putting the
|
||||
* card and host interface into "Memory and IO" mode.
|
||||
*/
|
||||
CS_CHECK(RequestConfiguration,
|
||||
pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
dev->irq = link->irq.AssignedIRQ;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
@@ -714,9 +688,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
}
|
||||
return ret;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
|
||||
failed:
|
||||
kfree(hw_priv);
|
||||
prism2_release((u_long)link);
|
||||
|
@@ -591,7 +591,7 @@ static int if_cs_prog_helper(struct if_cs_card *card)
|
||||
|
||||
/* TODO: make firmware file configurable */
|
||||
ret = request_firmware(&fw, "libertas_cs_helper.fw",
|
||||
&handle_to_dev(card->p_dev));
|
||||
&card->p_dev->dev);
|
||||
if (ret) {
|
||||
lbs_pr_err("can't load helper firmware\n");
|
||||
ret = -ENODEV;
|
||||
@@ -664,7 +664,7 @@ static int if_cs_prog_real(struct if_cs_card *card)
|
||||
|
||||
/* TODO: make firmware file configurable */
|
||||
ret = request_firmware(&fw, "libertas_cs.fw",
|
||||
&handle_to_dev(card->p_dev));
|
||||
&card->p_dev->dev);
|
||||
if (ret) {
|
||||
lbs_pr_err("can't load firmware\n");
|
||||
ret = -ENODEV;
|
||||
@@ -794,18 +794,37 @@ static void if_cs_release(struct pcmcia_device *p_dev)
|
||||
* configure the card at this point -- we wait until we receive a card
|
||||
* insertion event.
|
||||
*/
|
||||
|
||||
static int if_cs_ioprobe(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
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;
|
||||
|
||||
/* Do we need to allocate an interrupt? */
|
||||
if (cfg->irq.IRQInfo1)
|
||||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
if (cfg->io.nwin != 1) {
|
||||
lbs_pr_err("wrong CIS (check number of IO windows)\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
return pcmcia_request_io(p_dev, &p_dev->io);
|
||||
}
|
||||
|
||||
static int if_cs_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
int ret = -ENOMEM;
|
||||
unsigned int prod_id;
|
||||
struct lbs_private *priv;
|
||||
struct if_cs_card *card;
|
||||
/* CIS parsing */
|
||||
tuple_t tuple;
|
||||
cisparse_t parse;
|
||||
cistpl_cftable_entry_t *cfg = &parse.cftable_entry;
|
||||
cistpl_io_t *io = &cfg->io;
|
||||
u_char buf[64];
|
||||
|
||||
lbs_deb_enter(LBS_DEB_CS);
|
||||
|
||||
@@ -819,48 +838,15 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
|
||||
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
p_dev->irq.Handler = NULL;
|
||||
p_dev->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID;
|
||||
|
||||
p_dev->conf.Attributes = 0;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
|
||||
tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
if ((ret = pcmcia_get_first_tuple(p_dev, &tuple)) != 0 ||
|
||||
(ret = pcmcia_get_tuple_data(p_dev, &tuple)) != 0 ||
|
||||
(ret = pcmcia_parse_tuple(&tuple, &parse)) != 0)
|
||||
{
|
||||
lbs_pr_err("error in pcmcia_get_first_tuple etc\n");
|
||||
if (pcmcia_loop_config(p_dev, if_cs_ioprobe, NULL)) {
|
||||
lbs_pr_err("error in pcmcia_loop_config\n");
|
||||
goto out1;
|
||||
}
|
||||
|
||||
p_dev->conf.ConfigIndex = cfg->index;
|
||||
|
||||
/* Do we need to allocate an interrupt? */
|
||||
if (cfg->irq.IRQInfo1) {
|
||||
p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
}
|
||||
|
||||
/* IO window settings */
|
||||
if (cfg->io.nwin != 1) {
|
||||
lbs_pr_err("wrong CIS (check number of IO windows)\n");
|
||||
ret = -ENODEV;
|
||||
goto out1;
|
||||
}
|
||||
p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
p_dev->io.BasePort1 = io->win[0].base;
|
||||
p_dev->io.NumPorts1 = io->win[0].len;
|
||||
|
||||
/* This reserves IO space but doesn't actually enable it */
|
||||
ret = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
if (ret) {
|
||||
lbs_pr_err("error in pcmcia_request_io\n");
|
||||
goto out1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate an interrupt line. Note that this does not assign
|
||||
|
@@ -109,7 +109,7 @@ orinoco_cs_probe(struct pcmcia_device *link)
|
||||
struct orinoco_private *priv;
|
||||
struct orinoco_pccard *card;
|
||||
|
||||
priv = alloc_orinocodev(sizeof(*card), &handle_to_dev(link),
|
||||
priv = alloc_orinocodev(sizeof(*card), &link->dev,
|
||||
orinoco_cs_hard_reset, NULL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
@@ -120,10 +120,8 @@ orinoco_cs_probe(struct pcmcia_device *link)
|
||||
link->priv = priv;
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = orinoco_interrupt;
|
||||
link->irq.Instance = priv;
|
||||
|
||||
/* General socket configuration defaults can go here. In this
|
||||
* client, we assume very little, and rely on the CIS for
|
||||
@@ -160,12 +158,6 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
|
||||
* device available to the system.
|
||||
*/
|
||||
|
||||
#define CS_CHECK(fn, ret) do { \
|
||||
last_fn = (fn); \
|
||||
if ((last_ret = (ret)) != 0) \
|
||||
goto cs_failed; \
|
||||
} while (0)
|
||||
|
||||
static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
@@ -240,7 +232,7 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
struct orinoco_private *priv = link->priv;
|
||||
struct orinoco_pccard *card = priv->card;
|
||||
hermes_t *hw = &priv->hw;
|
||||
int last_fn, last_ret;
|
||||
int ret;
|
||||
void __iomem *mem;
|
||||
|
||||
/*
|
||||
@@ -257,13 +249,12 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
* and most client drivers will only use the CIS to fill in
|
||||
* implementation-defined details.
|
||||
*/
|
||||
last_ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL);
|
||||
if (last_ret) {
|
||||
ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL);
|
||||
if (ret) {
|
||||
if (!ignore_cis_vcc)
|
||||
printk(KERN_ERR PFX "GetNextTuple(): No matching "
|
||||
"CIS configuration. Maybe you need the "
|
||||
"ignore_cis_vcc=1 parameter.\n");
|
||||
cs_error(link, RequestIO, last_ret);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
@@ -272,14 +263,16 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
* a handler to the interrupt, unless the 'Handler' member of
|
||||
* the irq structure is initialized.
|
||||
*/
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* 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);
|
||||
if (!mem)
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
|
||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||
|
||||
@@ -288,8 +281,9 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
* the I/O windows and the interrupt mapping, and putting the
|
||||
* card and host interface into "Memory and IO" mode.
|
||||
*/
|
||||
CS_CHECK(RequestConfiguration,
|
||||
pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* Ok, we have the configuration, prepare to register the netdev */
|
||||
card->node.major = card->node.minor = 0;
|
||||
@@ -315,9 +309,6 @@ orinoco_cs_config(struct pcmcia_device *link)
|
||||
* net_device has been registered */
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
|
||||
failed:
|
||||
orinoco_cs_release(link);
|
||||
return -ENODEV;
|
||||
|
@@ -73,9 +73,6 @@ static void spectrum_cs_release(struct pcmcia_device *link);
|
||||
#define HCR_MEM16 0x10 /* memory width bit, should be preserved */
|
||||
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
/*
|
||||
* Reset the card using configuration registers COR and CCSR.
|
||||
* If IDLE is 1, stop the firmware, so that it can be safely rewritten.
|
||||
@@ -83,7 +80,7 @@ static void spectrum_cs_release(struct pcmcia_device *link);
|
||||
static int
|
||||
spectrum_reset(struct pcmcia_device *link, int idle)
|
||||
{
|
||||
int last_ret, last_fn;
|
||||
int ret;
|
||||
conf_reg_t reg;
|
||||
u_int save_cor;
|
||||
|
||||
@@ -95,23 +92,26 @@ spectrum_reset(struct pcmcia_device *link, int idle)
|
||||
reg.Function = 0;
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_COR;
|
||||
CS_CHECK(AccessConfigurationRegister,
|
||||
pcmcia_access_configuration_register(link, ®));
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
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);
|
||||
CS_CHECK(AccessConfigurationRegister,
|
||||
pcmcia_access_configuration_register(link, ®));
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
if (ret)
|
||||
goto failed;
|
||||
udelay(1000);
|
||||
|
||||
/* Read CCSR */
|
||||
reg.Action = CS_READ;
|
||||
reg.Offset = CISREG_CCSR;
|
||||
CS_CHECK(AccessConfigurationRegister,
|
||||
pcmcia_access_configuration_register(link, ®));
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
* Start or stop the firmware. Memory width bit should be
|
||||
@@ -120,21 +120,22 @@ spectrum_reset(struct pcmcia_device *link, int idle)
|
||||
reg.Action = CS_WRITE;
|
||||
reg.Offset = CISREG_CCSR;
|
||||
reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16);
|
||||
CS_CHECK(AccessConfigurationRegister,
|
||||
pcmcia_access_configuration_register(link, ®));
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
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);
|
||||
CS_CHECK(AccessConfigurationRegister,
|
||||
pcmcia_access_configuration_register(link, ®));
|
||||
ret = pcmcia_access_configuration_register(link, ®);
|
||||
if (ret)
|
||||
goto failed;
|
||||
udelay(1000);
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -181,7 +182,7 @@ spectrum_cs_probe(struct pcmcia_device *link)
|
||||
struct orinoco_private *priv;
|
||||
struct orinoco_pccard *card;
|
||||
|
||||
priv = alloc_orinocodev(sizeof(*card), &handle_to_dev(link),
|
||||
priv = alloc_orinocodev(sizeof(*card), &link->dev,
|
||||
spectrum_cs_hard_reset,
|
||||
spectrum_cs_stop_firmware);
|
||||
if (!priv)
|
||||
@@ -193,10 +194,8 @@ spectrum_cs_probe(struct pcmcia_device *link)
|
||||
link->priv = priv;
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = orinoco_interrupt;
|
||||
link->irq.Instance = priv;
|
||||
|
||||
/* General socket configuration defaults can go here. In this
|
||||
* client, we assume very little, and rely on the CIS for
|
||||
@@ -307,7 +306,7 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
struct orinoco_private *priv = link->priv;
|
||||
struct orinoco_pccard *card = priv->card;
|
||||
hermes_t *hw = &priv->hw;
|
||||
int last_fn, last_ret;
|
||||
int ret;
|
||||
void __iomem *mem;
|
||||
|
||||
/*
|
||||
@@ -324,13 +323,12 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
* and most client drivers will only use the CIS to fill in
|
||||
* implementation-defined details.
|
||||
*/
|
||||
last_ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL);
|
||||
if (last_ret) {
|
||||
ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL);
|
||||
if (ret) {
|
||||
if (!ignore_cis_vcc)
|
||||
printk(KERN_ERR PFX "GetNextTuple(): No matching "
|
||||
"CIS configuration. Maybe you need the "
|
||||
"ignore_cis_vcc=1 parameter.\n");
|
||||
cs_error(link, RequestIO, last_ret);
|
||||
goto failed;
|
||||
}
|
||||
|
||||
@@ -339,14 +337,16 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
* a handler to the interrupt, unless the 'Handler' member of
|
||||
* the irq structure is initialized.
|
||||
*/
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* 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);
|
||||
if (!mem)
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
|
||||
hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);
|
||||
|
||||
@@ -355,8 +355,9 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
* the I/O windows and the interrupt mapping, and putting the
|
||||
* card and host interface into "Memory and IO" mode.
|
||||
*/
|
||||
CS_CHECK(RequestConfiguration,
|
||||
pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* Ok, we have the configuration, prepare to register the netdev */
|
||||
card->node.major = card->node.minor = 0;
|
||||
@@ -386,9 +387,6 @@ spectrum_cs_config(struct pcmcia_device *link)
|
||||
* net_device has been registered */
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
|
||||
failed:
|
||||
spectrum_cs_release(link);
|
||||
return -ENODEV;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -67,23 +67,7 @@
|
||||
/* For rough constant delay */
|
||||
#define WL3501_NOPLOOP(n) { int x = 0; while (x++ < n) slow_down_io(); }
|
||||
|
||||
/*
|
||||
* All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If you do not
|
||||
* define PCMCIA_DEBUG at all, all the debug code will be left out. If you
|
||||
* compile with PCMCIA_DEBUG=0, the debug code will be present but disabled --
|
||||
* but it can then be enabled for specific modules at load time with a
|
||||
* 'pc_debug=#' option to insmod.
|
||||
*/
|
||||
#define PCMCIA_DEBUG 0
|
||||
#ifdef PCMCIA_DEBUG
|
||||
static int pc_debug = PCMCIA_DEBUG;
|
||||
module_param(pc_debug, int, 0);
|
||||
#define dprintk(n, format, args...) \
|
||||
{ if (pc_debug > (n)) \
|
||||
printk(KERN_INFO "%s: " format "\n", __func__ , ##args); }
|
||||
#else
|
||||
#define dprintk(n, format, args...)
|
||||
#endif
|
||||
|
||||
|
||||
#define wl3501_outb(a, b) { outb(a, b); slow_down_io(); }
|
||||
#define wl3501_outb_p(a, b) { outb_p(a, b); slow_down_io(); }
|
||||
@@ -684,10 +668,10 @@ static void wl3501_mgmt_scan_confirm(struct wl3501_card *this, u16 addr)
|
||||
int matchflag = 0;
|
||||
struct wl3501_scan_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
if (sig.status == WL3501_STATUS_SUCCESS) {
|
||||
dprintk(3, "success");
|
||||
pr_debug("success");
|
||||
if ((this->net_type == IW_MODE_INFRA &&
|
||||
(sig.cap_info & WL3501_MGMT_CAPABILITY_ESS)) ||
|
||||
(this->net_type == IW_MODE_ADHOC &&
|
||||
@@ -722,7 +706,7 @@ static void wl3501_mgmt_scan_confirm(struct wl3501_card *this, u16 addr)
|
||||
}
|
||||
}
|
||||
} else if (sig.status == WL3501_STATUS_TIMEOUT) {
|
||||
dprintk(3, "timeout");
|
||||
pr_debug("timeout");
|
||||
this->join_sta_bss = 0;
|
||||
for (i = this->join_sta_bss; i < this->bss_cnt; i++)
|
||||
if (!wl3501_mgmt_join(this, i))
|
||||
@@ -879,7 +863,7 @@ static int wl3501_mgmt_auth(struct wl3501_card *this)
|
||||
.timeout = 1000,
|
||||
};
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
memcpy(sig.mac_addr, this->bssid, ETH_ALEN);
|
||||
return wl3501_esbq_exec(this, &sig, sizeof(sig));
|
||||
}
|
||||
@@ -893,7 +877,7 @@ static int wl3501_mgmt_association(struct wl3501_card *this)
|
||||
.cap_info = this->cap_info,
|
||||
};
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
memcpy(sig.mac_addr, this->bssid, ETH_ALEN);
|
||||
return wl3501_esbq_exec(this, &sig, sizeof(sig));
|
||||
}
|
||||
@@ -903,7 +887,7 @@ static void wl3501_mgmt_join_confirm(struct net_device *dev, u16 addr)
|
||||
struct wl3501_card *this = netdev_priv(dev);
|
||||
struct wl3501_join_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
if (sig.status == WL3501_STATUS_SUCCESS) {
|
||||
if (this->net_type == IW_MODE_INFRA) {
|
||||
@@ -962,7 +946,7 @@ static inline void wl3501_md_confirm_interrupt(struct net_device *dev,
|
||||
{
|
||||
struct wl3501_md_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
wl3501_free_tx_buffer(this, sig.data);
|
||||
if (netif_queue_stopped(dev))
|
||||
@@ -1017,7 +1001,7 @@ static inline void wl3501_md_ind_interrupt(struct net_device *dev,
|
||||
static inline void wl3501_get_confirm_interrupt(struct wl3501_card *this,
|
||||
u16 addr, void *sig, int size)
|
||||
{
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &this->sig_get_confirm,
|
||||
sizeof(this->sig_get_confirm));
|
||||
wake_up(&this->wait);
|
||||
@@ -1029,7 +1013,7 @@ static inline void wl3501_start_confirm_interrupt(struct net_device *dev,
|
||||
{
|
||||
struct wl3501_start_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
if (sig.status == WL3501_STATUS_SUCCESS)
|
||||
netif_wake_queue(dev);
|
||||
@@ -1041,7 +1025,7 @@ static inline void wl3501_assoc_confirm_interrupt(struct net_device *dev,
|
||||
struct wl3501_card *this = netdev_priv(dev);
|
||||
struct wl3501_assoc_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
|
||||
if (sig.status == WL3501_STATUS_SUCCESS)
|
||||
@@ -1053,7 +1037,7 @@ static inline void wl3501_auth_confirm_interrupt(struct wl3501_card *this,
|
||||
{
|
||||
struct wl3501_auth_confirm sig;
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
wl3501_get_from_wla(this, addr, &sig, sizeof(sig));
|
||||
|
||||
if (sig.status == WL3501_STATUS_SUCCESS)
|
||||
@@ -1069,7 +1053,7 @@ static inline void wl3501_rx_interrupt(struct net_device *dev)
|
||||
u8 sig_id;
|
||||
struct wl3501_card *this = netdev_priv(dev);
|
||||
|
||||
dprintk(3, "entry");
|
||||
pr_debug("entry");
|
||||
loop:
|
||||
morepkts = 0;
|
||||
if (!wl3501_esbq_confirm(this))
|
||||
@@ -1302,7 +1286,7 @@ static int wl3501_reset(struct net_device *dev)
|
||||
wl3501_ack_interrupt(this);
|
||||
wl3501_unblock_interrupt(this);
|
||||
wl3501_mgmt_scan(this, 100);
|
||||
dprintk(1, "%s: device reset", dev->name);
|
||||
pr_debug("%s: device reset", dev->name);
|
||||
rc = 0;
|
||||
out:
|
||||
return rc;
|
||||
@@ -1376,7 +1360,7 @@ static int wl3501_open(struct net_device *dev)
|
||||
link->open++;
|
||||
|
||||
/* Initial WL3501 firmware */
|
||||
dprintk(1, "%s: Initialize WL3501 firmware...", dev->name);
|
||||
pr_debug("%s: Initialize WL3501 firmware...", dev->name);
|
||||
if (wl3501_init_firmware(this))
|
||||
goto fail;
|
||||
/* Initial device variables */
|
||||
@@ -1388,7 +1372,7 @@ static int wl3501_open(struct net_device *dev)
|
||||
wl3501_unblock_interrupt(this);
|
||||
wl3501_mgmt_scan(this, 100);
|
||||
rc = 0;
|
||||
dprintk(1, "%s: WL3501 opened", dev->name);
|
||||
pr_debug("%s: WL3501 opened", dev->name);
|
||||
printk(KERN_INFO "%s: Card Name: %s\n"
|
||||
"%s: Firmware Date: %s\n",
|
||||
dev->name, this->card_name,
|
||||
@@ -1914,8 +1898,7 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
|
||||
p_dev->io.IOAddrLines = 5;
|
||||
|
||||
/* Interrupt setup */
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT;
|
||||
p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
p_dev->irq.Handler = wl3501_interrupt;
|
||||
|
||||
/* General socket configuration */
|
||||
@@ -1938,16 +1921,13 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
|
||||
dev->wireless_handlers = &wl3501_handler_def;
|
||||
SET_ETHTOOL_OPS(dev, &ops);
|
||||
netif_stop_queue(dev);
|
||||
p_dev->priv = p_dev->irq.Instance = dev;
|
||||
p_dev->priv = dev;
|
||||
|
||||
return wl3501_config(p_dev);
|
||||
out_link:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
/**
|
||||
* wl3501_config - configure the PCMCIA socket and make eth device available
|
||||
* @link - FILL_IN
|
||||
@@ -1959,7 +1939,7 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
static int wl3501_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
int i = 0, j, last_fn, last_ret;
|
||||
int i = 0, j, ret;
|
||||
struct wl3501_card *this;
|
||||
|
||||
/* Try allocating IO ports. This tries a few fixed addresses. If you
|
||||
@@ -1975,24 +1955,26 @@ static int wl3501_config(struct pcmcia_device *link)
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIO, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
/* Now allocate an interrupt line. Note that this does not actually
|
||||
* assign a handler to the interrupt. */
|
||||
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* This actually configures the PCMCIA socket -- setting up the I/O
|
||||
* windows and the interrupt mapping. */
|
||||
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
dev->irq = link->irq.AssignedIRQ;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
SET_NETDEV_DEV(dev, &handle_to_dev(link));
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
if (register_netdev(dev)) {
|
||||
printk(KERN_NOTICE "wl3501_cs: register_netdev() failed\n");
|
||||
goto failed;
|
||||
@@ -2041,8 +2023,6 @@ static int wl3501_config(struct pcmcia_device *link)
|
||||
netif_start_queue(dev);
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
wl3501_release(link);
|
||||
return -ENODEV;
|
||||
|
Reference in New Issue
Block a user