You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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: (50 commits) pcmcia: rework the irq_req_t typedef pcmcia: remove deprecated handle_to_dev() macro pcmcia: pcmcia_request_window() doesn't need a pointer to a pointer pcmcia: remove unused "window_t" typedef pcmcia: move some window-related code to pcmcia_ioctl.c pcmcia: Change window_handle_t logic to unsigned long pcmcia: Pass struct pcmcia_socket to pcmcia_get_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_map_mem_page() pcmcia: Pass struct pcmcia_device to pcmcia_release_window() drivers/pcmcia: remove unnecessary kzalloc pcmcia: correct handling for Zoomed Video registers in topic.h pcmcia: fix printk formats pcmcia: autoload module pcmcia pcmcia/staging: update comedi drivers PCMCIA: stop duplicating pci_irq in soc_pcmcia_socket PCMCIA: ss: allow PCI IRQs > 255 PCMCIA: soc_common: remove 'dev' member from soc_pcmcia_socket PCMCIA: soc_common: constify soc_pcmcia_socket ops member PCMCIA: sa1111: remove duplicated initializers PCMCIA: sa1111: wrap soc_pcmcia_socket to contain sa1111 specific data ...
This commit is contained in:
@@ -177,9 +177,6 @@ static struct ata_port_operations pcmcia_8bit_port_ops = {
|
||||
.drain_fifo = pcmcia_8bit_drain_fifo,
|
||||
};
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
|
||||
struct pcmcia_config_check {
|
||||
unsigned long ctl_base;
|
||||
@@ -252,7 +249,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
struct ata_port *ap;
|
||||
struct ata_pcmcia_info *info;
|
||||
struct pcmcia_config_check *stk = NULL;
|
||||
int last_ret = 0, last_fn = 0, is_kme = 0, ret = -ENOMEM, p;
|
||||
int is_kme = 0, ret = -ENOMEM, p;
|
||||
unsigned long io_base, ctl_base;
|
||||
void __iomem *io_addr, *ctl_addr;
|
||||
int n_ports = 1;
|
||||
@@ -271,7 +268,6 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
pdev->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
pdev->io.IOAddrLines = 3;
|
||||
pdev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
pdev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
pdev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
pdev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -296,8 +292,13 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
}
|
||||
io_base = pdev->io.BasePort1;
|
||||
ctl_base = stk->ctl_base;
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(pdev, &pdev->irq));
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(pdev, &pdev->conf));
|
||||
ret = pcmcia_request_irq(pdev, &pdev->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_request_configuration(pdev, &pdev->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* iomap */
|
||||
ret = -ENOMEM;
|
||||
@@ -351,8 +352,6 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
|
||||
kfree(stk);
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(pdev, last_fn, last_ret);
|
||||
failed:
|
||||
kfree(stk);
|
||||
info->ndev = 0;
|
||||
|
||||
@@ -867,11 +867,9 @@ static int bluecard_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
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 = bluecard_interrupt;
|
||||
link->irq.Instance = info;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -905,22 +903,16 @@ static int bluecard_config(struct pcmcia_device *link)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIO, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (bluecard_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
@@ -659,11 +659,9 @@ static int bt3c_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
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 = bt3c_interrupt;
|
||||
link->irq.Instance = info;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -740,21 +738,16 @@ static int bt3c_config(struct pcmcia_device *link)
|
||||
goto found_port;
|
||||
|
||||
BT_ERR("No usable port range found");
|
||||
cs_error(link, RequestIO, -ENODEV);
|
||||
goto failed;
|
||||
|
||||
found_port:
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (bt3c_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
@@ -588,11 +588,9 @@ static int btuart_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
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 = btuart_interrupt;
|
||||
link->irq.Instance = info;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -669,21 +667,16 @@ static int btuart_config(struct pcmcia_device *link)
|
||||
goto found_port;
|
||||
|
||||
BT_ERR("No usable port range found");
|
||||
cs_error(link, RequestIO, -ENODEV);
|
||||
goto failed;
|
||||
|
||||
found_port:
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (btuart_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
@@ -573,11 +573,9 @@ static int dtl1_probe(struct pcmcia_device *link)
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.NumPorts1 = 8;
|
||||
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 = dtl1_interrupt;
|
||||
link->irq.Instance = info;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -622,16 +620,12 @@ static int dtl1_config(struct pcmcia_device *link)
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
if (i != 0)
|
||||
link->irq.AssignedIRQ = 0;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
if (dtl1_open(info) != 0)
|
||||
goto failed;
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
* All rights reserved. Licensed under dual BSD/GPL license.
|
||||
*/
|
||||
|
||||
/* #define PCMCIA_DEBUG 6 */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -47,18 +45,17 @@
|
||||
|
||||
/* #define ATR_CSUM */
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#define reader_to_dev(x) (&handle_to_dev(x->p_dev))
|
||||
static int pc_debug = PCMCIA_DEBUG;
|
||||
module_param(pc_debug, int, 0600);
|
||||
#define DEBUGP(n, rdr, x, args...) do { \
|
||||
if (pc_debug >= (n)) \
|
||||
dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x, \
|
||||
__func__ , ## args); \
|
||||
#define reader_to_dev(x) (&x->p_dev->dev)
|
||||
|
||||
/* n (debug level) is ignored */
|
||||
/* additional debug output may be enabled by re-compiling with
|
||||
* CM4000_DEBUG set */
|
||||
/* #define CM4000_DEBUG */
|
||||
#define DEBUGP(n, rdr, x, args...) do { \
|
||||
dev_dbg(reader_to_dev(rdr), "%s:" x, \
|
||||
__func__ , ## args); \
|
||||
} while (0)
|
||||
#else
|
||||
#define DEBUGP(n, rdr, x, args...)
|
||||
#endif
|
||||
|
||||
static char *version = "cm4000_cs.c v2.4.0gm6 - All bugs added by Harald Welte";
|
||||
|
||||
#define T_1SEC (HZ)
|
||||
@@ -174,14 +171,13 @@ static unsigned char fi_di_table[10][14] = {
|
||||
/* 9 */ {0x09,0x19,0x29,0x39,0x49,0x59,0x69,0x11,0x11,0x99,0xA9,0xB9,0xC9,0xD9}
|
||||
};
|
||||
|
||||
#ifndef PCMCIA_DEBUG
|
||||
#ifndef CM4000_DEBUG
|
||||
#define xoutb outb
|
||||
#define xinb inb
|
||||
#else
|
||||
static inline void xoutb(unsigned char val, unsigned short port)
|
||||
{
|
||||
if (pc_debug >= 7)
|
||||
printk(KERN_DEBUG "outb(val=%.2x,port=%.4x)\n", val, port);
|
||||
pr_debug("outb(val=%.2x,port=%.4x)\n", val, port);
|
||||
outb(val, port);
|
||||
}
|
||||
static inline unsigned char xinb(unsigned short port)
|
||||
@@ -189,8 +185,7 @@ static inline unsigned char xinb(unsigned short port)
|
||||
unsigned char val;
|
||||
|
||||
val = inb(port);
|
||||
if (pc_debug >= 7)
|
||||
printk(KERN_DEBUG "%.2x=inb(%.4x)\n", val, port);
|
||||
pr_debug("%.2x=inb(%.4x)\n", val, port);
|
||||
|
||||
return val;
|
||||
}
|
||||
@@ -514,12 +509,10 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
|
||||
for (i = 0; i < 4; i++) {
|
||||
xoutb(i, REG_BUF_ADDR(iobase));
|
||||
xoutb(dev->pts[i], REG_BUF_DATA(iobase)); /* buf data */
|
||||
#ifdef PCMCIA_DEBUG
|
||||
if (pc_debug >= 5)
|
||||
printk("0x%.2x ", dev->pts[i]);
|
||||
#ifdef CM4000_DEBUG
|
||||
pr_debug("0x%.2x ", dev->pts[i]);
|
||||
}
|
||||
if (pc_debug >= 5)
|
||||
printk("\n");
|
||||
pr_debug("\n");
|
||||
#else
|
||||
}
|
||||
#endif
|
||||
@@ -579,14 +572,13 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
|
||||
pts_reply[i] = inb(REG_BUF_DATA(iobase));
|
||||
}
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#ifdef CM4000_DEBUG
|
||||
DEBUGP(2, dev, "PTSreply: ");
|
||||
for (i = 0; i < num_bytes_read; i++) {
|
||||
if (pc_debug >= 5)
|
||||
printk("0x%.2x ", pts_reply[i]);
|
||||
pr_debug("0x%.2x ", pts_reply[i]);
|
||||
}
|
||||
printk("\n");
|
||||
#endif /* PCMCIA_DEBUG */
|
||||
pr_debug("\n");
|
||||
#endif /* CM4000_DEBUG */
|
||||
|
||||
DEBUGP(5, dev, "Clear Tactive in Flags1\n");
|
||||
xoutb(0x20, REG_FLAGS1(iobase));
|
||||
@@ -655,7 +647,7 @@ static void terminate_monitor(struct cm4000_dev *dev)
|
||||
|
||||
DEBUGP(5, dev, "Delete timer\n");
|
||||
del_timer_sync(&dev->timer);
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#ifdef CM4000_DEBUG
|
||||
dev->monitor_running = 0;
|
||||
#endif
|
||||
|
||||
@@ -898,7 +890,7 @@ static void monitor_card(unsigned long p)
|
||||
DEBUGP(4, dev, "ATR checksum (0x%.2x, should "
|
||||
"be zero) failed\n", dev->atr_csum);
|
||||
}
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#ifdef CM4000_DEBUG
|
||||
else if (test_bit(IS_BAD_LENGTH, &dev->flags)) {
|
||||
DEBUGP(4, dev, "ATR length error\n");
|
||||
} else {
|
||||
@@ -1415,7 +1407,7 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
int size;
|
||||
int rc;
|
||||
void __user *argp = (void __user *)arg;
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#ifdef CM4000_DEBUG
|
||||
char *ioctl_names[CM_IOC_MAXNR + 1] = {
|
||||
[_IOC_NR(CM_IOCGSTATUS)] "CM_IOCGSTATUS",
|
||||
[_IOC_NR(CM_IOCGATR)] "CM_IOCGATR",
|
||||
@@ -1423,9 +1415,9 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
[_IOC_NR(CM_IOCSPTS)] "CM_IOCSPTS",
|
||||
[_IOC_NR(CM_IOSDBGLVL)] "CM4000_DBGLVL",
|
||||
};
|
||||
#endif
|
||||
DEBUGP(3, dev, "cmm_ioctl(device=%d.%d) %s\n", imajor(inode),
|
||||
iminor(inode), ioctl_names[_IOC_NR(cmd)]);
|
||||
#endif
|
||||
|
||||
lock_kernel();
|
||||
rc = -ENODEV;
|
||||
@@ -1523,7 +1515,7 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
case CM_IOCARDOFF:
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#ifdef CM4000_DEBUG
|
||||
DEBUGP(4, dev, "... in CM_IOCARDOFF\n");
|
||||
if (dev->flags0 & 0x01) {
|
||||
DEBUGP(4, dev, " Card inserted\n");
|
||||
@@ -1625,18 +1617,9 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
|
||||
}
|
||||
break;
|
||||
#ifdef PCMCIA_DEBUG
|
||||
case CM_IOSDBGLVL: /* set debug log level */
|
||||
{
|
||||
int old_pc_debug = 0;
|
||||
|
||||
old_pc_debug = pc_debug;
|
||||
if (copy_from_user(&pc_debug, argp, sizeof(int)))
|
||||
rc = -EFAULT;
|
||||
else if (old_pc_debug != pc_debug)
|
||||
DEBUGP(0, dev, "Changed debug log level "
|
||||
"to %i\n", pc_debug);
|
||||
}
|
||||
#ifdef CM4000_DEBUG
|
||||
case CM_IOSDBGLVL:
|
||||
rc = -ENOTTY;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
* All rights reserved, Dual BSD/GPL Licensed.
|
||||
*/
|
||||
|
||||
/* #define PCMCIA_DEBUG 6 */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -41,18 +39,16 @@
|
||||
#include "cm4040_cs.h"
|
||||
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#define reader_to_dev(x) (&handle_to_dev(x->p_dev))
|
||||
static int pc_debug = PCMCIA_DEBUG;
|
||||
module_param(pc_debug, int, 0600);
|
||||
#define DEBUGP(n, rdr, x, args...) do { \
|
||||
if (pc_debug >= (n)) \
|
||||
dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x, \
|
||||
__func__ , ##args); \
|
||||
#define reader_to_dev(x) (&x->p_dev->dev)
|
||||
|
||||
/* n (debug level) is ignored */
|
||||
/* additional debug output may be enabled by re-compiling with
|
||||
* CM4040_DEBUG set */
|
||||
/* #define CM4040_DEBUG */
|
||||
#define DEBUGP(n, rdr, x, args...) do { \
|
||||
dev_dbg(reader_to_dev(rdr), "%s:" x, \
|
||||
__func__ , ## args); \
|
||||
} while (0)
|
||||
#else
|
||||
#define DEBUGP(n, rdr, x, args...)
|
||||
#endif
|
||||
|
||||
static char *version =
|
||||
"OMNIKEY CardMan 4040 v1.1.0gm5 - All bugs added by Harald Welte";
|
||||
@@ -90,14 +86,13 @@ struct reader_dev {
|
||||
|
||||
static struct pcmcia_device *dev_table[CM_MAX_DEV];
|
||||
|
||||
#ifndef PCMCIA_DEBUG
|
||||
#ifndef CM4040_DEBUG
|
||||
#define xoutb outb
|
||||
#define xinb inb
|
||||
#else
|
||||
static inline void xoutb(unsigned char val, unsigned short port)
|
||||
{
|
||||
if (pc_debug >= 7)
|
||||
printk(KERN_DEBUG "outb(val=%.2x,port=%.4x)\n", val, port);
|
||||
pr_debug("outb(val=%.2x,port=%.4x)\n", val, port);
|
||||
outb(val, port);
|
||||
}
|
||||
|
||||
@@ -106,8 +101,7 @@ static inline unsigned char xinb(unsigned short port)
|
||||
unsigned char val;
|
||||
|
||||
val = inb(port);
|
||||
if (pc_debug >= 7)
|
||||
printk(KERN_DEBUG "%.2x=inb(%.4x)\n", val, port);
|
||||
pr_debug("%.2x=inb(%.4x)\n", val, port);
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
@@ -260,23 +254,22 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
|
||||
return -EIO;
|
||||
}
|
||||
dev->r_buf[i] = xinb(iobase + REG_OFFSET_BULK_IN);
|
||||
#ifdef PCMCIA_DEBUG
|
||||
if (pc_debug >= 6)
|
||||
printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);
|
||||
#ifdef CM4040_DEBUG
|
||||
pr_debug("%lu:%2x ", i, dev->r_buf[i]);
|
||||
}
|
||||
printk("\n");
|
||||
pr_debug("\n");
|
||||
#else
|
||||
}
|
||||
#endif
|
||||
|
||||
bytes_to_read = 5 + le32_to_cpu(*(__le32 *)&dev->r_buf[1]);
|
||||
|
||||
DEBUGP(6, dev, "BytesToRead=%lu\n", bytes_to_read);
|
||||
DEBUGP(6, dev, "BytesToRead=%zu\n", bytes_to_read);
|
||||
|
||||
min_bytes_to_read = min(count, bytes_to_read + 5);
|
||||
min_bytes_to_read = min_t(size_t, min_bytes_to_read, READ_WRITE_BUFFER_SIZE);
|
||||
|
||||
DEBUGP(6, dev, "Min=%lu\n", min_bytes_to_read);
|
||||
DEBUGP(6, dev, "Min=%zu\n", min_bytes_to_read);
|
||||
|
||||
for (i = 0; i < (min_bytes_to_read-5); i++) {
|
||||
rc = wait_for_bulk_in_ready(dev);
|
||||
@@ -288,11 +281,10 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
|
||||
return -EIO;
|
||||
}
|
||||
dev->r_buf[i+5] = xinb(iobase + REG_OFFSET_BULK_IN);
|
||||
#ifdef PCMCIA_DEBUG
|
||||
if (pc_debug >= 6)
|
||||
printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);
|
||||
#ifdef CM4040_DEBUG
|
||||
pr_debug("%lu:%2x ", i, dev->r_buf[i]);
|
||||
}
|
||||
printk("\n");
|
||||
pr_debug("\n");
|
||||
#else
|
||||
}
|
||||
#endif
|
||||
@@ -547,7 +539,7 @@ static int cm4040_config_check(struct pcmcia_device *p_dev,
|
||||
p_dev->io.IOAddrLines = cfg->io.flags & CISTPL_IO_LINES_MASK;
|
||||
|
||||
rc = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
dev_printk(KERN_INFO, &handle_to_dev(p_dev),
|
||||
dev_printk(KERN_INFO, &p_dev->dev,
|
||||
"pcmcia_request_io returned 0x%x\n", rc);
|
||||
return rc;
|
||||
}
|
||||
@@ -569,7 +561,7 @@ static int reader_config(struct pcmcia_device *link, int devno)
|
||||
|
||||
fail_rc = pcmcia_request_configuration(link, &link->conf);
|
||||
if (fail_rc != 0) {
|
||||
dev_printk(KERN_INFO, &handle_to_dev(link),
|
||||
dev_printk(KERN_INFO, &link->dev,
|
||||
"pcmcia_request_configuration failed 0x%x\n",
|
||||
fail_rc);
|
||||
goto cs_release;
|
||||
|
||||
@@ -1213,12 +1213,12 @@ static irqreturn_t ipwireless_handle_v2_v3_interrupt(int irq,
|
||||
|
||||
irqreturn_t ipwireless_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct ipw_hardware *hw = dev_id;
|
||||
struct ipw_dev *ipw = dev_id;
|
||||
|
||||
if (hw->hw_version == HW_VERSION_1)
|
||||
return ipwireless_handle_v1_interrupt(irq, hw);
|
||||
if (ipw->hardware->hw_version == HW_VERSION_1)
|
||||
return ipwireless_handle_v1_interrupt(irq, ipw->hardware);
|
||||
else
|
||||
return ipwireless_handle_v2_v3_interrupt(irq, hw);
|
||||
return ipwireless_handle_v2_v3_interrupt(irq, ipw->hardware);
|
||||
}
|
||||
|
||||
static void flush_packets_to_hw(struct ipw_hardware *hw)
|
||||
|
||||
@@ -65,10 +65,7 @@ static void signalled_reboot_work(struct work_struct *work_reboot)
|
||||
struct ipw_dev *ipw = container_of(work_reboot, struct ipw_dev,
|
||||
work_reboot);
|
||||
struct pcmcia_device *link = ipw->link;
|
||||
int ret = pcmcia_reset_card(link->socket);
|
||||
|
||||
if (ret != 0)
|
||||
cs_error(link, ResetCard, ret);
|
||||
pcmcia_reset_card(link->socket);
|
||||
}
|
||||
|
||||
static void signalled_reboot_callback(void *callback_data)
|
||||
@@ -79,208 +76,127 @@ static void signalled_reboot_callback(void *callback_data)
|
||||
schedule_work(&ipw->work_reboot);
|
||||
}
|
||||
|
||||
static int config_ipwireless(struct ipw_dev *ipw)
|
||||
static int ipwireless_probe(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
unsigned int vcc,
|
||||
void *priv_data)
|
||||
{
|
||||
struct pcmcia_device *link = ipw->link;
|
||||
int ret;
|
||||
tuple_t tuple;
|
||||
unsigned short buf[64];
|
||||
cisparse_t parse;
|
||||
unsigned short cor_value;
|
||||
struct ipw_dev *ipw = priv_data;
|
||||
struct resource *io_resource;
|
||||
memreq_t memreq_attr_memory;
|
||||
memreq_t memreq_common_memory;
|
||||
int ret;
|
||||
|
||||
ipw->is_v2_card = 0;
|
||||
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = (cisdata_t *) buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
|
||||
tuple.DesiredTuple = RETURN_FIRST_TUPLE;
|
||||
|
||||
ret = pcmcia_get_first_tuple(link, &tuple);
|
||||
|
||||
while (ret == 0) {
|
||||
ret = pcmcia_get_tuple_data(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetTupleData, ret);
|
||||
goto exit0;
|
||||
}
|
||||
ret = pcmcia_get_next_tuple(link, &tuple);
|
||||
}
|
||||
|
||||
tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
|
||||
ret = pcmcia_get_first_tuple(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetFirstTuple, ret);
|
||||
goto exit0;
|
||||
}
|
||||
|
||||
ret = pcmcia_get_tuple_data(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetTupleData, ret);
|
||||
goto exit0;
|
||||
}
|
||||
|
||||
ret = pcmcia_parse_tuple(&tuple, &parse);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, ParseTuple, ret);
|
||||
goto exit0;
|
||||
}
|
||||
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
link->io.BasePort1 = parse.cftable_entry.io.win[0].base;
|
||||
link->io.NumPorts1 = parse.cftable_entry.io.win[0].len;
|
||||
link->io.IOAddrLines = 16;
|
||||
|
||||
link->irq.IRQInfo1 = parse.cftable_entry.irq.IRQInfo1;
|
||||
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;
|
||||
|
||||
/* 0x40 causes it to generate level mode interrupts. */
|
||||
/* 0x04 enables IREQ pin. */
|
||||
cor_value = parse.cftable_entry.index | 0x44;
|
||||
link->conf.ConfigIndex = cor_value;
|
||||
p_dev->conf.ConfigIndex = cfg->index | 0x44;
|
||||
ret = pcmcia_request_io(p_dev, &p_dev->io);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* IRQ and I/O settings */
|
||||
tuple.DesiredTuple = CISTPL_CONFIG;
|
||||
io_resource = request_region(p_dev->io.BasePort1, p_dev->io.NumPorts1,
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
|
||||
ret = pcmcia_get_first_tuple(link, &tuple);
|
||||
if (cfg->mem.nwin == 0)
|
||||
return 0;
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetFirstTuple, ret);
|
||||
goto exit0;
|
||||
}
|
||||
ipw->request_common_memory.Attributes =
|
||||
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
||||
ipw->request_common_memory.Base = cfg->mem.win[0].host_addr;
|
||||
ipw->request_common_memory.Size = cfg->mem.win[0].len;
|
||||
if (ipw->request_common_memory.Size < 0x1000)
|
||||
ipw->request_common_memory.Size = 0x1000;
|
||||
ipw->request_common_memory.AccessSpeed = 0;
|
||||
|
||||
ret = pcmcia_get_tuple_data(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetTupleData, ret);
|
||||
goto exit0;
|
||||
}
|
||||
|
||||
ret = pcmcia_parse_tuple(&tuple, &parse);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetTupleData, ret);
|
||||
goto exit0;
|
||||
}
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.ConfigBase = parse.config.base;
|
||||
link->conf.Present = parse.config.rmask[0];
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT;
|
||||
link->irq.Handler = ipwireless_interrupt;
|
||||
link->irq.Instance = ipw->hardware;
|
||||
|
||||
ret = pcmcia_request_io(link, &link->io);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestIO, ret);
|
||||
goto exit0;
|
||||
}
|
||||
|
||||
request_region(link->io.BasePort1, link->io.NumPorts1,
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
|
||||
/* memory settings */
|
||||
|
||||
tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
|
||||
ret = pcmcia_get_first_tuple(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetFirstTuple, ret);
|
||||
goto exit1;
|
||||
}
|
||||
|
||||
ret = pcmcia_get_tuple_data(link, &tuple);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, GetTupleData, ret);
|
||||
goto exit1;
|
||||
}
|
||||
|
||||
ret = pcmcia_parse_tuple(&tuple, &parse);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, ParseTuple, ret);
|
||||
goto exit1;
|
||||
}
|
||||
|
||||
if (parse.cftable_entry.mem.nwin > 0) {
|
||||
ipw->request_common_memory.Attributes =
|
||||
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_CM | WIN_ENABLE;
|
||||
ipw->request_common_memory.Base =
|
||||
parse.cftable_entry.mem.win[0].host_addr;
|
||||
ipw->request_common_memory.Size = parse.cftable_entry.mem.win[0].len;
|
||||
if (ipw->request_common_memory.Size < 0x1000)
|
||||
ipw->request_common_memory.Size = 0x1000;
|
||||
ipw->request_common_memory.AccessSpeed = 0;
|
||||
|
||||
ret = pcmcia_request_window(&link, &ipw->request_common_memory,
|
||||
ret = pcmcia_request_window(p_dev, &ipw->request_common_memory,
|
||||
&ipw->handle_common_memory);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestWindow, ret);
|
||||
goto exit1;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit1;
|
||||
|
||||
memreq_common_memory.CardOffset =
|
||||
parse.cftable_entry.mem.win[0].card_addr;
|
||||
memreq_common_memory.Page = 0;
|
||||
memreq_common_memory.CardOffset = cfg->mem.win[0].card_addr;
|
||||
memreq_common_memory.Page = 0;
|
||||
|
||||
ret = pcmcia_map_mem_page(ipw->handle_common_memory,
|
||||
ret = pcmcia_map_mem_page(p_dev, ipw->handle_common_memory,
|
||||
&memreq_common_memory);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, MapMemPage, ret);
|
||||
goto exit1;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit2;
|
||||
|
||||
ipw->is_v2_card =
|
||||
parse.cftable_entry.mem.win[0].len == 0x100;
|
||||
ipw->is_v2_card = cfg->mem.win[0].len == 0x100;
|
||||
|
||||
ipw->common_memory = ioremap(ipw->request_common_memory.Base,
|
||||
ipw->common_memory = ioremap(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size);
|
||||
request_mem_region(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size, IPWIRELESS_PCCARD_NAME);
|
||||
request_mem_region(ipw->request_common_memory.Base,
|
||||
ipw->request_common_memory.Size,
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
|
||||
ipw->request_attr_memory.Attributes =
|
||||
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM | WIN_ENABLE;
|
||||
ipw->request_attr_memory.Base = 0;
|
||||
ipw->request_attr_memory.Size = 0; /* this used to be 0x1000 */
|
||||
ipw->request_attr_memory.AccessSpeed = 0;
|
||||
ipw->request_attr_memory.Attributes =
|
||||
WIN_DATA_WIDTH_16 | WIN_MEMORY_TYPE_AM | WIN_ENABLE;
|
||||
ipw->request_attr_memory.Base = 0;
|
||||
ipw->request_attr_memory.Size = 0; /* this used to be 0x1000 */
|
||||
ipw->request_attr_memory.AccessSpeed = 0;
|
||||
|
||||
ret = pcmcia_request_window(&link, &ipw->request_attr_memory,
|
||||
ret = pcmcia_request_window(p_dev, &ipw->request_attr_memory,
|
||||
&ipw->handle_attr_memory);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestWindow, ret);
|
||||
goto exit2;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit2;
|
||||
|
||||
memreq_attr_memory.CardOffset = 0;
|
||||
memreq_attr_memory.Page = 0;
|
||||
memreq_attr_memory.CardOffset = 0;
|
||||
memreq_attr_memory.Page = 0;
|
||||
|
||||
ret = pcmcia_map_mem_page(ipw->handle_attr_memory,
|
||||
ret = pcmcia_map_mem_page(p_dev, ipw->handle_attr_memory,
|
||||
&memreq_attr_memory);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, MapMemPage, ret);
|
||||
goto exit2;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit3;
|
||||
|
||||
ipw->attr_memory = ioremap(ipw->request_attr_memory.Base,
|
||||
ipw->attr_memory = ioremap(ipw->request_attr_memory.Base,
|
||||
ipw->request_attr_memory.Size);
|
||||
request_mem_region(ipw->request_attr_memory.Base, ipw->request_attr_memory.Size,
|
||||
IPWIRELESS_PCCARD_NAME);
|
||||
}
|
||||
request_mem_region(ipw->request_attr_memory.Base,
|
||||
ipw->request_attr_memory.Size, IPWIRELESS_PCCARD_NAME);
|
||||
|
||||
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);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int config_ipwireless(struct ipw_dev *ipw)
|
||||
{
|
||||
struct pcmcia_device *link = ipw->link;
|
||||
int ret = 0;
|
||||
|
||||
ipw->is_v2_card = 0;
|
||||
|
||||
ret = pcmcia_loop_config(link, ipwireless_probe, ipw);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.Handler = ipwireless_interrupt;
|
||||
|
||||
INIT_WORK(&ipw->work_reboot, signalled_reboot_work);
|
||||
|
||||
@@ -291,10 +207,8 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestIRQ, ret);
|
||||
goto exit3;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit;
|
||||
|
||||
printk(KERN_INFO IPWIRELESS_PCCARD_NAME ": Card type %s\n",
|
||||
ipw->is_v2_card ? "V2/V3" : "V1");
|
||||
@@ -316,12 +230,12 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
|
||||
ipw->network = ipwireless_network_create(ipw->hardware);
|
||||
if (!ipw->network)
|
||||
goto exit3;
|
||||
goto exit;
|
||||
|
||||
ipw->tty = ipwireless_tty_create(ipw->hardware, ipw->network,
|
||||
ipw->nodes);
|
||||
if (!ipw->tty)
|
||||
goto exit3;
|
||||
goto exit;
|
||||
|
||||
ipwireless_init_hardware_v2_v3(ipw->hardware);
|
||||
|
||||
@@ -331,35 +245,27 @@ static int config_ipwireless(struct ipw_dev *ipw)
|
||||
*/
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestConfiguration, ret);
|
||||
goto exit4;
|
||||
}
|
||||
if (ret != 0)
|
||||
goto exit;
|
||||
|
||||
link->dev_node = &ipw->nodes[0];
|
||||
|
||||
return 0;
|
||||
|
||||
exit4:
|
||||
pcmcia_disable_device(link);
|
||||
exit3:
|
||||
exit:
|
||||
if (ipw->attr_memory) {
|
||||
release_mem_region(ipw->request_attr_memory.Base,
|
||||
ipw->request_attr_memory.Size);
|
||||
iounmap(ipw->attr_memory);
|
||||
pcmcia_release_window(ipw->handle_attr_memory);
|
||||
pcmcia_disable_device(link);
|
||||
pcmcia_release_window(link, 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(ipw->handle_common_memory);
|
||||
pcmcia_release_window(link, ipw->handle_common_memory);
|
||||
}
|
||||
exit1:
|
||||
pcmcia_disable_device(link);
|
||||
exit0:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -378,9 +284,9 @@ static void release_ipwireless(struct ipw_dev *ipw)
|
||||
iounmap(ipw->attr_memory);
|
||||
}
|
||||
if (ipw->common_memory)
|
||||
pcmcia_release_window(ipw->handle_common_memory);
|
||||
pcmcia_release_window(ipw->link, ipw->handle_common_memory);
|
||||
if (ipw->attr_memory)
|
||||
pcmcia_release_window(ipw->handle_attr_memory);
|
||||
pcmcia_release_window(ipw->link, ipw->handle_attr_memory);
|
||||
|
||||
/* Break the link with Card Services */
|
||||
pcmcia_disable_device(ipw->link);
|
||||
@@ -406,7 +312,6 @@ static int ipwireless_attach(struct pcmcia_device *link)
|
||||
|
||||
ipw->link = link;
|
||||
link->priv = ipw;
|
||||
link->irq.Instance = ipw;
|
||||
|
||||
/* Link this device into our device list. */
|
||||
link->dev_node = &ipw->nodes[0];
|
||||
@@ -421,7 +326,6 @@ static int ipwireless_attach(struct pcmcia_device *link)
|
||||
ret = config_ipwireless(ipw);
|
||||
|
||||
if (ret != 0) {
|
||||
cs_error(link, RegisterClient, ret);
|
||||
ipwireless_detach(link);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -554,7 +554,6 @@ static int mgslpc_probe(struct pcmcia_device *link)
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
link->conf.Attributes = 0;
|
||||
@@ -572,69 +571,51 @@ static int mgslpc_probe(struct pcmcia_device *link)
|
||||
/* Card has been inserted.
|
||||
*/
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
static int mgslpc_ioprobe(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
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;
|
||||
}
|
||||
|
||||
static int mgslpc_config(struct pcmcia_device *link)
|
||||
{
|
||||
MGSLPC_INFO *info = link->priv;
|
||||
tuple_t tuple;
|
||||
cisparse_t parse;
|
||||
int last_fn, last_ret;
|
||||
u_char buf[64];
|
||||
cistpl_cftable_entry_t dflt = { 0 };
|
||||
cistpl_cftable_entry_t *cfg;
|
||||
int ret;
|
||||
|
||||
if (debug_level >= DEBUG_LEVEL_INFO)
|
||||
printk("mgslpc_config(0x%p)\n", link);
|
||||
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
|
||||
/* get CIS configuration entry */
|
||||
|
||||
tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
|
||||
CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
|
||||
|
||||
cfg = &(parse.cftable_entry);
|
||||
CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
|
||||
CS_CHECK(ParseTuple, pcmcia_parse_tuple(&tuple, &parse));
|
||||
|
||||
if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
|
||||
if (cfg->index == 0)
|
||||
goto cs_failed;
|
||||
|
||||
link->conf.ConfigIndex = cfg->index;
|
||||
link->conf.Attributes |= CONF_ENABLE_IRQ;
|
||||
|
||||
/* IO window settings */
|
||||
link->io.NumPorts1 = 0;
|
||||
if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
|
||||
cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
|
||||
if (!(io->flags & CISTPL_IO_8BIT))
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
if (!(io->flags & CISTPL_IO_16BIT))
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
|
||||
link->io.BasePort1 = io->win[0].base;
|
||||
link->io.NumPorts1 = io->win[0].len;
|
||||
CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));
|
||||
}
|
||||
ret = pcmcia_loop_config(link, mgslpc_ioprobe, NULL);
|
||||
if (ret != 0)
|
||||
goto failed;
|
||||
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 8;
|
||||
link->conf.Present = PRESENT_OPTION;
|
||||
|
||||
link->irq.Attributes |= IRQ_HANDLE_PRESENT;
|
||||
link->irq.Handler = mgslpc_isr;
|
||||
link->irq.Instance = info;
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
info->io_base = link->io.BasePort1;
|
||||
info->irq_level = link->irq.AssignedIRQ;
|
||||
@@ -654,8 +635,7 @@ static int mgslpc_config(struct pcmcia_device *link)
|
||||
printk("\n");
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
mgslpc_release((u_long)link);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
+11
-22
@@ -60,15 +60,6 @@ MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
|
||||
MODULE_DESCRIPTION("PCMCIA ATA/IDE card driver");
|
||||
MODULE_LICENSE("Dual MPL/GPL");
|
||||
|
||||
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
|
||||
|
||||
#ifdef CONFIG_PCMCIA_DEBUG
|
||||
INT_MODULE_PARM(pc_debug, 0);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
typedef struct ide_info_t {
|
||||
@@ -98,7 +89,7 @@ static int ide_probe(struct pcmcia_device *link)
|
||||
{
|
||||
ide_info_t *info;
|
||||
|
||||
DEBUG(0, "ide_attach()\n");
|
||||
dev_dbg(&link->dev, "ide_attach()\n");
|
||||
|
||||
/* Create new ide device */
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
@@ -112,7 +103,6 @@ static int ide_probe(struct pcmcia_device *link)
|
||||
link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
|
||||
link->io.IOAddrLines = 3;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -134,7 +124,7 @@ static void ide_detach(struct pcmcia_device *link)
|
||||
ide_hwif_t *hwif = info->host->ports[0];
|
||||
unsigned long data_addr, ctl_addr;
|
||||
|
||||
DEBUG(0, "ide_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "ide_detach(0x%p)\n", link);
|
||||
|
||||
data_addr = hwif->io_ports.data_addr;
|
||||
ctl_addr = hwif->io_ports.ctl_addr;
|
||||
@@ -217,9 +207,6 @@ out_release:
|
||||
|
||||
======================================================================*/
|
||||
|
||||
#define CS_CHECK(fn, ret) \
|
||||
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
|
||||
|
||||
struct pcmcia_config_check {
|
||||
unsigned long ctl_base;
|
||||
int skip_vcc;
|
||||
@@ -282,11 +269,11 @@ static int ide_config(struct pcmcia_device *link)
|
||||
{
|
||||
ide_info_t *info = link->priv;
|
||||
struct pcmcia_config_check *stk = NULL;
|
||||
int last_ret = 0, last_fn = 0, is_kme = 0;
|
||||
int ret = 0, is_kme = 0;
|
||||
unsigned long io_base, ctl_base;
|
||||
struct ide_host *host;
|
||||
|
||||
DEBUG(0, "ide_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "ide_config(0x%p)\n", link);
|
||||
|
||||
is_kme = ((link->manf_id == MANFID_KME) &&
|
||||
((link->card_id == PRODID_KME_KXLC005_A) ||
|
||||
@@ -306,8 +293,12 @@ static int ide_config(struct pcmcia_device *link)
|
||||
io_base = link->io.BasePort1;
|
||||
ctl_base = stk->ctl_base;
|
||||
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/* disable drive interrupts during IDE probe */
|
||||
outb(0x02, ctl_base);
|
||||
@@ -342,8 +333,6 @@ err_mem:
|
||||
printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n");
|
||||
goto failed;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
kfree(stk);
|
||||
ide_release(link);
|
||||
@@ -363,7 +352,7 @@ static void ide_release(struct pcmcia_device *link)
|
||||
ide_info_t *info = link->priv;
|
||||
struct ide_host *host = info->host;
|
||||
|
||||
DEBUG(0, "ide_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "ide_release(0x%p)\n", link);
|
||||
|
||||
if (info->ndev)
|
||||
/* FIXME: if this fails we need to queue the cleanup somehow
|
||||
|
||||
@@ -111,8 +111,6 @@ static int avmcs_probe(struct pcmcia_device *p_dev)
|
||||
p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
|
||||
|
||||
p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -198,7 +196,6 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
*/
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
/* undo */
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
@@ -209,7 +206,6 @@ static int avmcs_config(struct pcmcia_device *link)
|
||||
*/
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -30,22 +30,6 @@ MODULE_DESCRIPTION("ISDN4Linux: PCMCIA client driver for AVM A1/Fritz!PCMCIA car
|
||||
MODULE_AUTHOR("Carsten Paeth");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/*
|
||||
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);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
|
||||
static char *version =
|
||||
"avma1_cs.c 1.00 1998/01/23 10:00:00 (Carsten Paeth)";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -119,7 +103,7 @@ static int avma1cs_probe(struct pcmcia_device *p_dev)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "avma1cs_attach()\n");
|
||||
dev_dbg(&p_dev->dev, "avma1cs_attach()\n");
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
@@ -139,8 +123,6 @@ static int avma1cs_probe(struct pcmcia_device *p_dev)
|
||||
p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
|
||||
p_dev->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
|
||||
|
||||
p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
|
||||
/* General socket configuration */
|
||||
p_dev->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
p_dev->conf.IntType = INT_MEMORY_AND_IO;
|
||||
@@ -161,7 +143,7 @@ static int avma1cs_probe(struct pcmcia_device *p_dev)
|
||||
|
||||
static void avma1cs_detach(struct pcmcia_device *link)
|
||||
{
|
||||
DEBUG(0, "avma1cs_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "avma1cs_detach(0x%p)\n", link);
|
||||
avma1cs_release(link);
|
||||
kfree(link->priv);
|
||||
} /* avma1cs_detach */
|
||||
@@ -203,7 +185,7 @@ static int avma1cs_config(struct pcmcia_device *link)
|
||||
|
||||
dev = link->priv;
|
||||
|
||||
DEBUG(0, "avma1cs_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "avma1cs_config(0x%p)\n", link);
|
||||
|
||||
devname[0] = 0;
|
||||
if (link->prod_id[1])
|
||||
@@ -218,7 +200,6 @@ static int avma1cs_config(struct pcmcia_device *link)
|
||||
*/
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIRQ, i);
|
||||
/* undo */
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
@@ -229,7 +210,6 @@ static int avma1cs_config(struct pcmcia_device *link)
|
||||
*/
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestConfiguration, i);
|
||||
pcmcia_disable_device(link);
|
||||
break;
|
||||
}
|
||||
@@ -281,7 +261,7 @@ static void avma1cs_release(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local = link->priv;
|
||||
|
||||
DEBUG(0, "avma1cs_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "avma1cs_release(0x%p)\n", link);
|
||||
|
||||
/* now unregister function with hisax */
|
||||
HiSax_closecard(local->node.minor);
|
||||
|
||||
@@ -57,23 +57,6 @@ MODULE_DESCRIPTION("ISDN4Linux: PCMCIA client driver for Elsa PCM cards");
|
||||
MODULE_AUTHOR("Klaus Lichtenwalder");
|
||||
MODULE_LICENSE("Dual MPL/GPL");
|
||||
|
||||
/*
|
||||
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);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
|
||||
static char *version =
|
||||
"elsa_cs.c $Revision: 1.2.2.4 $ $Date: 2004/01/25 15:07:06 $ (K.Lichtenwalder)";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -142,7 +125,7 @@ static int elsa_cs_probe(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "elsa_cs_attach()\n");
|
||||
dev_dbg(&link->dev, "elsa_cs_attach()\n");
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
@@ -155,7 +138,6 @@ static int elsa_cs_probe(struct pcmcia_device *link)
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID|IRQ_SHARE_ID;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
@@ -188,7 +170,7 @@ static void elsa_cs_detach(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *info = link->priv;
|
||||
|
||||
DEBUG(0, "elsa_cs_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "elsa_cs_detach(0x%p)\n", link);
|
||||
|
||||
info->busy = 1;
|
||||
elsa_cs_release(link);
|
||||
@@ -231,30 +213,25 @@ static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
|
||||
static int elsa_cs_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
int i, last_fn;
|
||||
int i;
|
||||
IsdnCard_t icard;
|
||||
|
||||
DEBUG(0, "elsa_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "elsa_config(0x%p)\n", link);
|
||||
dev = link->priv;
|
||||
|
||||
i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL);
|
||||
if (i != 0) {
|
||||
last_fn = RequestIO;
|
||||
goto cs_failed;
|
||||
}
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
link->irq.AssignedIRQ = 0;
|
||||
last_fn = RequestIRQ;
|
||||
goto cs_failed;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
last_fn = RequestConfiguration;
|
||||
goto cs_failed;
|
||||
}
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. *//* */
|
||||
@@ -290,8 +267,7 @@ static int elsa_cs_config(struct pcmcia_device *link)
|
||||
((local_info_t*)link->priv)->cardnr = i;
|
||||
|
||||
return 0;
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, i);
|
||||
failed:
|
||||
elsa_cs_release(link);
|
||||
return -ENODEV;
|
||||
} /* elsa_cs_config */
|
||||
@@ -308,7 +284,7 @@ static void elsa_cs_release(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local = link->priv;
|
||||
|
||||
DEBUG(0, "elsa_cs_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "elsa_cs_release(0x%p)\n", link);
|
||||
|
||||
if (local) {
|
||||
if (local->cardnr >= 0) {
|
||||
|
||||
@@ -57,24 +57,6 @@ MODULE_DESCRIPTION("ISDN4Linux: PCMCIA client driver for Sedlbauer cards");
|
||||
MODULE_AUTHOR("Marcus Niemann");
|
||||
MODULE_LICENSE("Dual MPL/GPL");
|
||||
|
||||
/*
|
||||
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);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
|
||||
static char *version =
|
||||
"sedlbauer_cs.c 1.1a 2001/01/28 15:04:04 (M.Niemann)";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -151,7 +133,7 @@ static int sedlbauer_probe(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "sedlbauer_attach()\n");
|
||||
dev_dbg(&link->dev, "sedlbauer_attach()\n");
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
@@ -163,7 +145,6 @@ static int sedlbauer_probe(struct pcmcia_device *link)
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
@@ -198,7 +179,7 @@ static int sedlbauer_probe(struct pcmcia_device *link)
|
||||
|
||||
static void sedlbauer_detach(struct pcmcia_device *link)
|
||||
{
|
||||
DEBUG(0, "sedlbauer_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "sedlbauer_detach(0x%p)\n", link);
|
||||
|
||||
((local_info_t *)link->priv)->stop = 1;
|
||||
sedlbauer_release(link);
|
||||
@@ -214,9 +195,6 @@ static void sedlbauer_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 sedlbauer_config_check(struct pcmcia_device *p_dev,
|
||||
cistpl_cftable_entry_t *cfg,
|
||||
cistpl_cftable_entry_t *dflt,
|
||||
@@ -293,11 +271,11 @@ static int sedlbauer_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;
|
||||
}
|
||||
return 0;
|
||||
@@ -309,10 +287,10 @@ static int sedlbauer_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev = link->priv;
|
||||
win_req_t *req;
|
||||
int last_fn, last_ret;
|
||||
int ret;
|
||||
IsdnCard_t icard;
|
||||
|
||||
DEBUG(0, "sedlbauer_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link);
|
||||
|
||||
req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
|
||||
if (!req)
|
||||
@@ -330,8 +308,8 @@ static int 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.
|
||||
*/
|
||||
last_ret = pcmcia_loop_config(link, sedlbauer_config_check, req);
|
||||
if (last_ret)
|
||||
ret = pcmcia_loop_config(link, sedlbauer_config_check, req);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
/*
|
||||
@@ -339,15 +317,20 @@ static int sedlbauer_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;
|
||||
|
||||
/*
|
||||
At this point, the dev_node_t structure(s) need to be
|
||||
@@ -380,19 +363,18 @@ static int sedlbauer_config(struct pcmcia_device *link)
|
||||
icard.protocol = protocol;
|
||||
icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA;
|
||||
|
||||
last_ret = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->stop), &icard);
|
||||
if (last_ret < 0) {
|
||||
printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d at i/o %#x\n",
|
||||
last_ret, link->io.BasePort1);
|
||||
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);
|
||||
sedlbauer_release(link);
|
||||
return -ENODEV;
|
||||
} else
|
||||
((local_info_t*)link->priv)->cardnr = last_ret;
|
||||
((local_info_t *)link->priv)->cardnr = ret;
|
||||
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
sedlbauer_release(link);
|
||||
return -ENODEV;
|
||||
@@ -410,7 +392,7 @@ failed:
|
||||
static void sedlbauer_release(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local = link->priv;
|
||||
DEBUG(0, "sedlbauer_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "sedlbauer_release(0x%p)\n", link);
|
||||
|
||||
if (local) {
|
||||
if (local->cardnr >= 0) {
|
||||
|
||||
@@ -38,23 +38,6 @@ MODULE_DESCRIPTION("ISDN4Linux: PCMCIA client driver for Teles PCMCIA cards");
|
||||
MODULE_AUTHOR("Christof Petig, christof.petig@wtal.de, Karsten Keil, kkeil@suse.de");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/*
|
||||
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);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
|
||||
static char *version =
|
||||
"teles_cs.c 2.10 2002/07/30 22:23:34 kkeil";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -133,7 +116,7 @@ static int teles_probe(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local;
|
||||
|
||||
DEBUG(0, "teles_attach()\n");
|
||||
dev_dbg(&link->dev, "teles_attach()\n");
|
||||
|
||||
/* Allocate space for private device-specific data */
|
||||
local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
|
||||
@@ -145,7 +128,6 @@ static int teles_probe(struct pcmcia_device *link)
|
||||
|
||||
/* Interrupt setup */
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID|IRQ_SHARE_ID;
|
||||
link->irq.Handler = NULL;
|
||||
|
||||
/*
|
||||
@@ -178,7 +160,7 @@ static void teles_detach(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *info = link->priv;
|
||||
|
||||
DEBUG(0, "teles_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "teles_detach(0x%p)\n", link);
|
||||
|
||||
info->busy = 1;
|
||||
teles_cs_release(link);
|
||||
@@ -221,30 +203,25 @@ static int teles_cs_configcheck(struct pcmcia_device *p_dev,
|
||||
static int teles_cs_config(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *dev;
|
||||
int i, last_fn;
|
||||
int i;
|
||||
IsdnCard_t icard;
|
||||
|
||||
DEBUG(0, "teles_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "teles_config(0x%p)\n", link);
|
||||
dev = link->priv;
|
||||
|
||||
i = pcmcia_loop_config(link, teles_cs_configcheck, NULL);
|
||||
if (i != 0) {
|
||||
last_fn = RequestIO;
|
||||
if (i != 0)
|
||||
goto cs_failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_irq(link, &link->irq);
|
||||
if (i != 0) {
|
||||
link->irq.AssignedIRQ = 0;
|
||||
last_fn = RequestIRQ;
|
||||
goto cs_failed;
|
||||
}
|
||||
|
||||
i = pcmcia_request_configuration(link, &link->conf);
|
||||
if (i != 0) {
|
||||
last_fn = RequestConfiguration;
|
||||
if (i != 0)
|
||||
goto cs_failed;
|
||||
}
|
||||
|
||||
/* At this point, the dev_node_t structure(s) should be
|
||||
initialized and arranged in a linked list at link->dev. *//* */
|
||||
@@ -283,7 +260,6 @@ static int teles_cs_config(struct pcmcia_device *link)
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, i);
|
||||
teles_cs_release(link);
|
||||
return -ENODEV;
|
||||
} /* teles_cs_config */
|
||||
@@ -300,7 +276,7 @@ static void teles_cs_release(struct pcmcia_device *link)
|
||||
{
|
||||
local_info_t *local = link->priv;
|
||||
|
||||
DEBUG(0, "teles_cs_release(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "teles_cs_release(0x%p)\n", link);
|
||||
|
||||
if (local) {
|
||||
if (local->cardnr >= 0) {
|
||||
|
||||
+104
-105
@@ -118,11 +118,9 @@ static caddr_t remap_window(struct map_info *map, unsigned long to)
|
||||
DEBUG(2, "Remapping window from 0x%8.8x to 0x%8.8x",
|
||||
dev->offset, mrq.CardOffset);
|
||||
mrq.Page = 0;
|
||||
ret = pcmcia_map_mem_page(win, &mrq);
|
||||
if (ret != 0) {
|
||||
cs_error(dev->p_dev, MapMemPage, ret);
|
||||
ret = pcmcia_map_mem_page(dev->p_dev, win, &mrq);
|
||||
if (ret != 0)
|
||||
return NULL;
|
||||
}
|
||||
dev->offset = mrq.CardOffset;
|
||||
}
|
||||
return dev->win_base + (to & (dev->win_size-1));
|
||||
@@ -327,8 +325,6 @@ static void pcmciamtd_set_vpp(struct map_info *map, int on)
|
||||
|
||||
DEBUG(2, "dev = %p on = %d vpp = %d\n", dev, on, dev->vpp);
|
||||
ret = pcmcia_modify_configuration(link, &mod);
|
||||
if (ret != 0)
|
||||
cs_error(link, ModifyConfiguration, ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -348,107 +344,116 @@ static void pcmciamtd_release(struct pcmcia_device *link)
|
||||
iounmap(dev->win_base);
|
||||
dev->win_base = NULL;
|
||||
}
|
||||
pcmcia_release_window(link->win);
|
||||
pcmcia_release_window(link, link->win);
|
||||
}
|
||||
pcmcia_disable_device(link);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_MTD_DEBUG
|
||||
static int pcmciamtd_cistpl_format(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data)
|
||||
{
|
||||
cisparse_t parse;
|
||||
|
||||
if (!pcmcia_parse_tuple(tuple, &parse)) {
|
||||
cistpl_format_t *t = &parse.format;
|
||||
(void)t; /* Shut up, gcc */
|
||||
DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",
|
||||
t->type, t->edc, t->offset, t->length);
|
||||
}
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
static int pcmciamtd_cistpl_jedec(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data)
|
||||
{
|
||||
cisparse_t parse;
|
||||
int i;
|
||||
|
||||
if (!pcmcia_parse_tuple(tuple, &parse)) {
|
||||
cistpl_jedec_t *t = &parse.jedec;
|
||||
for (i = 0; i < t->nid; i++)
|
||||
DEBUG(2, "JEDEC: 0x%02x 0x%02x", t->id[i].mfr, t->id[i].info);
|
||||
}
|
||||
return -ENOSPC;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int pcmciamtd_cistpl_device(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = priv_data;
|
||||
cisparse_t parse;
|
||||
cistpl_device_t *t = &parse.device;
|
||||
int i;
|
||||
|
||||
if (pcmcia_parse_tuple(tuple, &parse))
|
||||
return -EINVAL;
|
||||
|
||||
DEBUG(2, "Common memory:");
|
||||
dev->pcmcia_map.size = t->dev[0].size;
|
||||
/* from here on: DEBUG only */
|
||||
for (i = 0; i < t->ndev; i++) {
|
||||
DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);
|
||||
DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);
|
||||
DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);
|
||||
DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcmciamtd_cistpl_geo(struct pcmcia_device *p_dev,
|
||||
tuple_t *tuple,
|
||||
void *priv_data)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = priv_data;
|
||||
cisparse_t parse;
|
||||
cistpl_device_geo_t *t = &parse.device_geo;
|
||||
int i;
|
||||
|
||||
if (pcmcia_parse_tuple(tuple, &parse))
|
||||
return -EINVAL;
|
||||
|
||||
dev->pcmcia_map.bankwidth = t->geo[0].buswidth;
|
||||
/* from here on: DEBUG only */
|
||||
for (i = 0; i < t->ngeo; i++) {
|
||||
DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);
|
||||
DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);
|
||||
DEBUG(2, "region: %d read_block = %u", i, t->geo[i].read_block);
|
||||
DEBUG(2, "region: %d write_block = %u", i, t->geo[i].write_block);
|
||||
DEBUG(2, "region: %d partition = %u", i, t->geo[i].partition);
|
||||
DEBUG(2, "region: %d interleave = %u", i, t->geo[i].interleave);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link, int *new_name)
|
||||
{
|
||||
int rc;
|
||||
tuple_t tuple;
|
||||
cisparse_t parse;
|
||||
u_char buf[64];
|
||||
int i;
|
||||
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = (cisdata_t *)buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
tuple.DesiredTuple = RETURN_FIRST_TUPLE;
|
||||
|
||||
rc = pcmcia_get_first_tuple(link, &tuple);
|
||||
while (rc == 0) {
|
||||
rc = pcmcia_get_tuple_data(link, &tuple);
|
||||
if (rc != 0) {
|
||||
cs_error(link, GetTupleData, rc);
|
||||
break;
|
||||
if (p_dev->prod_id[0]) {
|
||||
dev->mtd_name[0] = '\0';
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (i)
|
||||
strcat(dev->mtd_name, " ");
|
||||
if (p_dev->prod_id[i])
|
||||
strcat(dev->mtd_name, p_dev->prod_id[i]);
|
||||
}
|
||||
rc = pcmcia_parse_tuple(&tuple, &parse);
|
||||
if (rc != 0) {
|
||||
cs_error(link, ParseTuple, rc);
|
||||
break;
|
||||
}
|
||||
|
||||
switch(tuple.TupleCode) {
|
||||
case CISTPL_FORMAT: {
|
||||
cistpl_format_t *t = &parse.format;
|
||||
(void)t; /* Shut up, gcc */
|
||||
DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",
|
||||
t->type, t->edc, t->offset, t->length);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
case CISTPL_DEVICE: {
|
||||
cistpl_device_t *t = &parse.device;
|
||||
int i;
|
||||
DEBUG(2, "Common memory:");
|
||||
dev->pcmcia_map.size = t->dev[0].size;
|
||||
for(i = 0; i < t->ndev; i++) {
|
||||
DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);
|
||||
DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);
|
||||
DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);
|
||||
DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CISTPL_VERS_1: {
|
||||
cistpl_vers_1_t *t = &parse.version_1;
|
||||
int i;
|
||||
if(t->ns) {
|
||||
dev->mtd_name[0] = '\0';
|
||||
for(i = 0; i < t->ns; i++) {
|
||||
if(i)
|
||||
strcat(dev->mtd_name, " ");
|
||||
strcat(dev->mtd_name, t->str+t->ofs[i]);
|
||||
}
|
||||
}
|
||||
DEBUG(2, "Found name: %s", dev->mtd_name);
|
||||
break;
|
||||
}
|
||||
|
||||
case CISTPL_JEDEC_C: {
|
||||
cistpl_jedec_t *t = &parse.jedec;
|
||||
int i;
|
||||
for(i = 0; i < t->nid; i++) {
|
||||
DEBUG(2, "JEDEC: 0x%02x 0x%02x", t->id[i].mfr, t->id[i].info);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CISTPL_DEVICE_GEO: {
|
||||
cistpl_device_geo_t *t = &parse.device_geo;
|
||||
int i;
|
||||
dev->pcmcia_map.bankwidth = t->geo[0].buswidth;
|
||||
for(i = 0; i < t->ngeo; i++) {
|
||||
DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);
|
||||
DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);
|
||||
DEBUG(2, "region: %d read_block = %u", i, t->geo[i].read_block);
|
||||
DEBUG(2, "region: %d write_block = %u", i, t->geo[i].write_block);
|
||||
DEBUG(2, "region: %d partition = %u", i, t->geo[i].partition);
|
||||
DEBUG(2, "region: %d interleave = %u", i, t->geo[i].interleave);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
DEBUG(2, "Unknown tuple code %d", tuple.TupleCode);
|
||||
}
|
||||
|
||||
rc = pcmcia_get_next_tuple(link, &tuple);
|
||||
DEBUG(2, "Found name: %s", dev->mtd_name);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MTD_DEBUG
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_FORMAT, pcmciamtd_cistpl_format, NULL);
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_JEDEC_C, pcmciamtd_cistpl_jedec, NULL);
|
||||
#endif
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_DEVICE, pcmciamtd_cistpl_device, dev);
|
||||
pcmcia_loop_tuple(p_dev, CISTPL_DEVICE_GEO, pcmciamtd_cistpl_geo, dev);
|
||||
|
||||
if(!dev->pcmcia_map.size)
|
||||
dev->pcmcia_map.size = MAX_PCMCIA_ADDR;
|
||||
|
||||
@@ -481,16 +486,12 @@ static void card_settings(struct pcmciamtd_dev *dev, struct pcmcia_device *link,
|
||||
* MTD 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 pcmciamtd_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct pcmciamtd_dev *dev = link->priv;
|
||||
struct mtd_info *mtd = NULL;
|
||||
cs_status_t status;
|
||||
win_req_t req;
|
||||
int last_ret = 0, last_fn = 0;
|
||||
int ret;
|
||||
int i;
|
||||
static char *probes[] = { "jedec_probe", "cfi_probe" };
|
||||
@@ -529,7 +530,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
int ret;
|
||||
DEBUG(2, "requesting window with size = %dKiB memspeed = %d",
|
||||
req.Size >> 10, req.AccessSpeed);
|
||||
ret = pcmcia_request_window(&link, &req, &link->win);
|
||||
ret = pcmcia_request_window(link, &req, &link->win);
|
||||
DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size);
|
||||
if(ret) {
|
||||
req.Size >>= 1;
|
||||
@@ -577,7 +578,6 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
DEBUG(2, "Setting Configuration");
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret != 0) {
|
||||
cs_error(link, RequestConfiguration, ret);
|
||||
if (dev->win_base) {
|
||||
iounmap(dev->win_base);
|
||||
dev->win_base = NULL;
|
||||
@@ -652,8 +652,7 @@ static int pcmciamtd_config(struct pcmcia_device *link)
|
||||
link->dev_node = &dev->node;
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
err("CS Error, exiting");
|
||||
pcmciamtd_release(link);
|
||||
return -ENODEV;
|
||||
|
||||
@@ -118,14 +118,6 @@ INT_MODULE_PARM(full_duplex, 0);
|
||||
/* Autodetect link polarity reversal? */
|
||||
INT_MODULE_PARM(auto_polarity, 1);
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
|
||||
static char *version =
|
||||
"3c574_cs.c 1.65ac1 2003/04/07 Donald Becker/David Hinds, becker@scyld.com.\n";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -278,7 +270,7 @@ static int tc574_probe(struct pcmcia_device *link)
|
||||
struct el3_private *lp;
|
||||
struct net_device *dev;
|
||||
|
||||
DEBUG(0, "3c574_attach()\n");
|
||||
dev_dbg(&link->dev, "3c574_attach()\n");
|
||||
|
||||
/* Create the PC card device object. */
|
||||
dev = alloc_etherdev(sizeof(struct el3_private));
|
||||
@@ -291,10 +283,8 @@ static int tc574_probe(struct pcmcia_device *link)
|
||||
spin_lock_init(&lp->window_lock);
|
||||
link->io.NumPorts1 = 32;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
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 = &el3_interrupt;
|
||||
link->irq.Instance = dev;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 1;
|
||||
@@ -319,7 +309,7 @@ static void tc574_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
|
||||
DEBUG(0, "3c574_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "3c574_detach()\n");
|
||||
|
||||
if (link->dev_node)
|
||||
unregister_netdev(dev);
|
||||
@@ -335,26 +325,23 @@ static void tc574_detach(struct pcmcia_device *link)
|
||||
ethernet 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 const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
|
||||
|
||||
static int tc574_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
tuple_t tuple;
|
||||
__le16 buf[32];
|
||||
int last_fn, last_ret, i, j;
|
||||
int ret, i, j;
|
||||
unsigned int ioaddr;
|
||||
__be16 *phys_addr;
|
||||
char *cardname;
|
||||
__u32 config;
|
||||
u8 *buf;
|
||||
size_t len;
|
||||
|
||||
phys_addr = (__be16 *)dev->dev_addr;
|
||||
|
||||
DEBUG(0, "3c574_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "3c574_config()\n");
|
||||
|
||||
link->io.IOAddrLines = 16;
|
||||
for (i = j = 0; j < 0x400; j += 0x20) {
|
||||
@@ -363,12 +350,16 @@ static int tc574_config(struct pcmcia_device *link)
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIO, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
}
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
|
||||
dev->irq = link->irq.AssignedIRQ;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
@@ -378,16 +369,14 @@ static int tc574_config(struct pcmcia_device *link)
|
||||
/* The 3c574 normally uses an EEPROM for configuration info, including
|
||||
the hardware address. The future products may include a modem chip
|
||||
and put the address in the CIS. */
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = (cisdata_t *)buf;
|
||||
tuple.TupleDataMax = 64;
|
||||
tuple.TupleOffset = 0;
|
||||
tuple.DesiredTuple = 0x88;
|
||||
if (pcmcia_get_first_tuple(link, &tuple) == 0) {
|
||||
pcmcia_get_tuple_data(link, &tuple);
|
||||
|
||||
len = pcmcia_get_tuple(link, 0x88, &buf);
|
||||
if (buf && len >= 6) {
|
||||
for (i = 0; i < 3; i++)
|
||||
phys_addr[i] = htons(le16_to_cpu(buf[i]));
|
||||
phys_addr[i] = htons(le16_to_cpu(buf[i * 2]));
|
||||
kfree(buf);
|
||||
} else {
|
||||
kfree(buf); /* 0 < len < 6 */
|
||||
EL3WINDOW(0);
|
||||
for (i = 0; i < 3; i++)
|
||||
phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
|
||||
@@ -435,7 +424,8 @@ static int tc574_config(struct pcmcia_device *link)
|
||||
mii_status = mdio_read(ioaddr, phy & 0x1f, 1);
|
||||
if (mii_status != 0xffff) {
|
||||
lp->phys = phy & 0x1f;
|
||||
DEBUG(0, " MII transceiver at index %d, status %x.\n",
|
||||
dev_dbg(&link->dev, " MII transceiver at "
|
||||
"index %d, status %x.\n",
|
||||
phy, mii_status);
|
||||
if ((mii_status & 0x0040) == 0)
|
||||
mii_preamble_required = 1;
|
||||
@@ -457,7 +447,7 @@ static int tc574_config(struct pcmcia_device *link)
|
||||
}
|
||||
|
||||
link->dev_node = &lp->node;
|
||||
SET_NETDEV_DEV(dev, &handle_to_dev(link));
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
|
||||
if (register_netdev(dev) != 0) {
|
||||
printk(KERN_NOTICE "3c574_cs: register_netdev() failed\n");
|
||||
@@ -478,8 +468,6 @@ static int tc574_config(struct pcmcia_device *link)
|
||||
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
tc574_release(link);
|
||||
return -ENODEV;
|
||||
@@ -738,7 +726,7 @@ static int el3_open(struct net_device *dev)
|
||||
lp->media.expires = jiffies + HZ;
|
||||
add_timer(&lp->media);
|
||||
|
||||
DEBUG(2, "%s: opened, status %4.4x.\n",
|
||||
dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
|
||||
dev->name, inw(dev->base_addr + EL3_STATUS));
|
||||
|
||||
return 0;
|
||||
@@ -772,7 +760,7 @@ static void pop_tx_status(struct net_device *dev)
|
||||
if (tx_status & 0x30)
|
||||
tc574_wait_for_completion(dev, TxReset);
|
||||
if (tx_status & 0x38) {
|
||||
DEBUG(1, "%s: transmit error: status 0x%02x\n",
|
||||
pr_debug("%s: transmit error: status 0x%02x\n",
|
||||
dev->name, tx_status);
|
||||
outw(TxEnable, ioaddr + EL3_CMD);
|
||||
dev->stats.tx_aborted_errors++;
|
||||
@@ -788,7 +776,7 @@ static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
|
||||
pr_debug("%s: el3_start_xmit(length = %ld) called, "
|
||||
"status %4.4x.\n", dev->name, (long)skb->len,
|
||||
inw(ioaddr + EL3_STATUS));
|
||||
|
||||
@@ -827,7 +815,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
return IRQ_NONE;
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
DEBUG(3, "%s: interrupt, status %4.4x.\n",
|
||||
pr_debug("%s: interrupt, status %4.4x.\n",
|
||||
dev->name, inw(ioaddr + EL3_STATUS));
|
||||
|
||||
spin_lock(&lp->window_lock);
|
||||
@@ -836,7 +824,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
(IntLatch | RxComplete | RxEarly | StatsFull)) {
|
||||
if (!netif_device_present(dev) ||
|
||||
((status & 0xe000) != 0x2000)) {
|
||||
DEBUG(1, "%s: Interrupt from dead card\n", dev->name);
|
||||
pr_debug("%s: Interrupt from dead card\n", dev->name);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -846,7 +834,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
work_budget = el3_rx(dev, work_budget);
|
||||
|
||||
if (status & TxAvailable) {
|
||||
DEBUG(3, " TX room bit was handled.\n");
|
||||
pr_debug(" TX room bit was handled.\n");
|
||||
/* There's room in the FIFO for a full-sized packet. */
|
||||
outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
|
||||
netif_wake_queue(dev);
|
||||
@@ -886,7 +874,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
}
|
||||
|
||||
if (--work_budget < 0) {
|
||||
DEBUG(0, "%s: Too much work in interrupt, "
|
||||
pr_debug("%s: Too much work in interrupt, "
|
||||
"status %4.4x.\n", dev->name, status);
|
||||
/* Clear all interrupts */
|
||||
outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
|
||||
@@ -896,7 +884,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
|
||||
}
|
||||
|
||||
DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
|
||||
pr_debug("%s: exiting interrupt, status %4.4x.\n",
|
||||
dev->name, inw(ioaddr + EL3_STATUS));
|
||||
|
||||
spin_unlock(&lp->window_lock);
|
||||
@@ -1003,7 +991,7 @@ static void update_stats(struct net_device *dev)
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
u8 rx, tx, up;
|
||||
|
||||
DEBUG(2, "%s: updating the statistics.\n", dev->name);
|
||||
pr_debug("%s: updating the statistics.\n", dev->name);
|
||||
|
||||
if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
|
||||
return;
|
||||
@@ -1039,7 +1027,7 @@ static int el3_rx(struct net_device *dev, int worklimit)
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
short rx_status;
|
||||
|
||||
DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
||||
pr_debug("%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
||||
dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
|
||||
while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
|
||||
worklimit > 0) {
|
||||
@@ -1061,7 +1049,7 @@ static int el3_rx(struct net_device *dev, int worklimit)
|
||||
|
||||
skb = dev_alloc_skb(pkt_len+5);
|
||||
|
||||
DEBUG(3, " Receiving packet size %d status %4.4x.\n",
|
||||
pr_debug(" Receiving packet size %d status %4.4x.\n",
|
||||
pkt_len, rx_status);
|
||||
if (skb != NULL) {
|
||||
skb_reserve(skb, 2);
|
||||
@@ -1072,7 +1060,7 @@ static int el3_rx(struct net_device *dev, int worklimit)
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += pkt_len;
|
||||
} else {
|
||||
DEBUG(1, "%s: couldn't allocate a sk_buff of"
|
||||
pr_debug("%s: couldn't allocate a sk_buff of"
|
||||
" size %d.\n", dev->name, pkt_len);
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
@@ -1101,7 +1089,7 @@ static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
struct mii_ioctl_data *data = if_mii(rq);
|
||||
int phy = lp->phys & 0x1f;
|
||||
|
||||
DEBUG(2, "%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
|
||||
pr_debug("%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
|
||||
dev->name, rq->ifr_ifrn.ifrn_name, cmd,
|
||||
data->phy_id, data->reg_num, data->val_in, data->val_out);
|
||||
|
||||
@@ -1178,7 +1166,7 @@ static int el3_close(struct net_device *dev)
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
struct pcmcia_device *link = lp->p_dev;
|
||||
|
||||
DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
|
||||
dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
|
||||
|
||||
if (pcmcia_dev_present(link)) {
|
||||
unsigned long flags;
|
||||
|
||||
@@ -130,14 +130,6 @@ MODULE_LICENSE("GPL");
|
||||
/* Special hook for setting if_port when module is loaded */
|
||||
INT_MODULE_PARM(if_port, 0);
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
|
||||
static char *version =
|
||||
DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -189,7 +181,7 @@ static int tc589_probe(struct pcmcia_device *link)
|
||||
struct el3_private *lp;
|
||||
struct net_device *dev;
|
||||
|
||||
DEBUG(0, "3c589_attach()\n");
|
||||
dev_dbg(&link->dev, "3c589_attach()\n");
|
||||
|
||||
/* Create new ethernet device */
|
||||
dev = alloc_etherdev(sizeof(struct el3_private));
|
||||
@@ -202,10 +194,8 @@ static int tc589_probe(struct pcmcia_device *link)
|
||||
spin_lock_init(&lp->lock);
|
||||
link->io.NumPorts1 = 16;
|
||||
link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
|
||||
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 = &el3_interrupt;
|
||||
link->irq.Instance = dev;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
link->conf.ConfigIndex = 1;
|
||||
@@ -231,7 +221,7 @@ static void tc589_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
|
||||
DEBUG(0, "3c589_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "3c589_detach\n");
|
||||
|
||||
if (link->dev_node)
|
||||
unregister_netdev(dev);
|
||||
@@ -249,29 +239,20 @@ static void tc589_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 tc589_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
struct el3_private *lp = netdev_priv(dev);
|
||||
tuple_t tuple;
|
||||
__le16 buf[32];
|
||||
__be16 *phys_addr;
|
||||
int last_fn, last_ret, i, j, multi = 0, fifo;
|
||||
int ret, i, j, multi = 0, fifo;
|
||||
unsigned int ioaddr;
|
||||
char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
|
||||
u8 *buf;
|
||||
size_t len;
|
||||
|
||||
DEBUG(0, "3c589_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "3c589_config\n");
|
||||
|
||||
phys_addr = (__be16 *)dev->dev_addr;
|
||||
tuple.Attributes = 0;
|
||||
tuple.TupleData = (cisdata_t *)buf;
|
||||
tuple.TupleDataMax = sizeof(buf);
|
||||
tuple.TupleOffset = 0;
|
||||
tuple.Attributes = TUPLE_RETURN_COMMON;
|
||||
|
||||
/* Is this a 3c562? */
|
||||
if (link->manf_id != MANFID_3COM)
|
||||
printk(KERN_INFO "3c589_cs: hmmm, is this really a "
|
||||
@@ -287,12 +268,16 @@ static int tc589_config(struct pcmcia_device *link)
|
||||
if (i == 0)
|
||||
break;
|
||||
}
|
||||
if (i != 0) {
|
||||
cs_error(link, RequestIO, i);
|
||||
if (i != 0)
|
||||
goto failed;
|
||||
}
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
|
||||
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_request_configuration(link, &link->conf);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
dev->irq = link->irq.AssignedIRQ;
|
||||
dev->base_addr = link->io.BasePort1;
|
||||
@@ -301,12 +286,13 @@ static int tc589_config(struct pcmcia_device *link)
|
||||
|
||||
/* The 3c589 has an extra EEPROM for configuration info, including
|
||||
the hardware address. The 3c562 puts the address in the CIS. */
|
||||
tuple.DesiredTuple = 0x88;
|
||||
if (pcmcia_get_first_tuple(link, &tuple) == 0) {
|
||||
pcmcia_get_tuple_data(link, &tuple);
|
||||
for (i = 0; i < 3; i++)
|
||||
phys_addr[i] = htons(le16_to_cpu(buf[i]));
|
||||
len = pcmcia_get_tuple(link, 0x88, &buf);
|
||||
if (buf && len >= 6) {
|
||||
for (i = 0; i < 3; i++)
|
||||
phys_addr[i] = htons(le16_to_cpu(buf[i*2]));
|
||||
kfree(buf);
|
||||
} else {
|
||||
kfree(buf); /* 0 < len < 6 */
|
||||
for (i = 0; i < 3; i++)
|
||||
phys_addr[i] = htons(read_eeprom(ioaddr, i));
|
||||
if (phys_addr[0] == htons(0x6060)) {
|
||||
@@ -328,7 +314,7 @@ static int tc589_config(struct pcmcia_device *link)
|
||||
printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
|
||||
|
||||
link->dev_node = &lp->node;
|
||||
SET_NETDEV_DEV(dev, &handle_to_dev(link));
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
|
||||
if (register_netdev(dev) != 0) {
|
||||
printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
|
||||
@@ -347,8 +333,6 @@ static int tc589_config(struct pcmcia_device *link)
|
||||
if_names[dev->if_port]);
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
tc589_release(link);
|
||||
return -ENODEV;
|
||||
@@ -511,24 +495,8 @@ static void netdev_get_drvinfo(struct net_device *dev,
|
||||
sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
|
||||
}
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
static u32 netdev_get_msglevel(struct net_device *dev)
|
||||
{
|
||||
return pc_debug;
|
||||
}
|
||||
|
||||
static void netdev_set_msglevel(struct net_device *dev, u32 level)
|
||||
{
|
||||
pc_debug = level;
|
||||
}
|
||||
#endif /* PCMCIA_DEBUG */
|
||||
|
||||
static const struct ethtool_ops netdev_ethtool_ops = {
|
||||
.get_drvinfo = netdev_get_drvinfo,
|
||||
#ifdef PCMCIA_DEBUG
|
||||
.get_msglevel = netdev_get_msglevel,
|
||||
.set_msglevel = netdev_set_msglevel,
|
||||
#endif /* PCMCIA_DEBUG */
|
||||
};
|
||||
|
||||
static int el3_config(struct net_device *dev, struct ifmap *map)
|
||||
@@ -563,7 +531,7 @@ static int el3_open(struct net_device *dev)
|
||||
lp->media.expires = jiffies + HZ;
|
||||
add_timer(&lp->media);
|
||||
|
||||
DEBUG(1, "%s: opened, status %4.4x.\n",
|
||||
dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
|
||||
dev->name, inw(dev->base_addr + EL3_STATUS));
|
||||
|
||||
return 0;
|
||||
@@ -596,7 +564,7 @@ static void pop_tx_status(struct net_device *dev)
|
||||
if (tx_status & 0x30)
|
||||
tc589_wait_for_completion(dev, TxReset);
|
||||
if (tx_status & 0x38) {
|
||||
DEBUG(1, "%s: transmit error: status 0x%02x\n",
|
||||
pr_debug("%s: transmit error: status 0x%02x\n",
|
||||
dev->name, tx_status);
|
||||
outw(TxEnable, ioaddr + EL3_CMD);
|
||||
dev->stats.tx_aborted_errors++;
|
||||
@@ -612,7 +580,7 @@ static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
|
||||
struct el3_private *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
|
||||
pr_debug("%s: el3_start_xmit(length = %ld) called, "
|
||||
"status %4.4x.\n", dev->name, (long)skb->len,
|
||||
inw(ioaddr + EL3_STATUS));
|
||||
|
||||
@@ -654,14 +622,14 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
DEBUG(3, "%s: interrupt, status %4.4x.\n",
|
||||
pr_debug("%s: interrupt, status %4.4x.\n",
|
||||
dev->name, inw(ioaddr + EL3_STATUS));
|
||||
|
||||
spin_lock(&lp->lock);
|
||||
while ((status = inw(ioaddr + EL3_STATUS)) &
|
||||
(IntLatch | RxComplete | StatsFull)) {
|
||||
if ((status & 0xe000) != 0x2000) {
|
||||
DEBUG(1, "%s: interrupt from dead card\n", dev->name);
|
||||
pr_debug("%s: interrupt from dead card\n", dev->name);
|
||||
handled = 0;
|
||||
break;
|
||||
}
|
||||
@@ -670,7 +638,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
el3_rx(dev);
|
||||
|
||||
if (status & TxAvailable) {
|
||||
DEBUG(3, " TX room bit was handled.\n");
|
||||
pr_debug(" TX room bit was handled.\n");
|
||||
/* There's room in the FIFO for a full-sized packet. */
|
||||
outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
|
||||
netif_wake_queue(dev);
|
||||
@@ -722,7 +690,7 @@ static irqreturn_t el3_interrupt(int irq, void *dev_id)
|
||||
|
||||
lp->last_irq = jiffies;
|
||||
spin_unlock(&lp->lock);
|
||||
DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
|
||||
pr_debug("%s: exiting interrupt, status %4.4x.\n",
|
||||
dev->name, inw(ioaddr + EL3_STATUS));
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
@@ -833,7 +801,7 @@ static void update_stats(struct net_device *dev)
|
||||
{
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
|
||||
DEBUG(2, "%s: updating the statistics.\n", dev->name);
|
||||
pr_debug("%s: updating the statistics.\n", dev->name);
|
||||
/* Turn off statistics updates while reading. */
|
||||
outw(StatsDisable, ioaddr + EL3_CMD);
|
||||
/* Switch to the stats window, and read everything. */
|
||||
@@ -861,7 +829,7 @@ static int el3_rx(struct net_device *dev)
|
||||
int worklimit = 32;
|
||||
short rx_status;
|
||||
|
||||
DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
||||
pr_debug("%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
|
||||
dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
|
||||
while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
|
||||
worklimit > 0) {
|
||||
@@ -883,7 +851,7 @@ static int el3_rx(struct net_device *dev)
|
||||
|
||||
skb = dev_alloc_skb(pkt_len+5);
|
||||
|
||||
DEBUG(3, " Receiving packet size %d status %4.4x.\n",
|
||||
pr_debug(" Receiving packet size %d status %4.4x.\n",
|
||||
pkt_len, rx_status);
|
||||
if (skb != NULL) {
|
||||
skb_reserve(skb, 2);
|
||||
@@ -894,7 +862,7 @@ static int el3_rx(struct net_device *dev)
|
||||
dev->stats.rx_packets++;
|
||||
dev->stats.rx_bytes += pkt_len;
|
||||
} else {
|
||||
DEBUG(1, "%s: couldn't allocate a sk_buff of"
|
||||
pr_debug("%s: couldn't allocate a sk_buff of"
|
||||
" size %d.\n", dev->name, pkt_len);
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
@@ -935,7 +903,7 @@ static int el3_close(struct net_device *dev)
|
||||
struct pcmcia_device *link = lp->p_dev;
|
||||
unsigned int ioaddr = dev->base_addr;
|
||||
|
||||
DEBUG(1, "%s: shutting down ethercard.\n", dev->name);
|
||||
dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
|
||||
|
||||
if (pcmcia_dev_present(link)) {
|
||||
/* Turn off statistics ASAP. We update dev->stats below. */
|
||||
|
||||
@@ -75,16 +75,6 @@ MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
|
||||
MODULE_DESCRIPTION("Asix AX88190 PCMCIA ethernet driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
|
||||
|
||||
INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
|
||||
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
|
||||
static char *version =
|
||||
"axnet_cs.c 1.28 2002/06/29 06:27:37 (David Hinds)";
|
||||
#else
|
||||
#define DEBUG(n, args...)
|
||||
#endif
|
||||
|
||||
/*====================================================================*/
|
||||
|
||||
@@ -167,7 +157,7 @@ static int axnet_probe(struct pcmcia_device *link)
|
||||
struct net_device *dev;
|
||||
struct ei_device *ei_local;
|
||||
|
||||
DEBUG(0, "axnet_attach()\n");
|
||||
dev_dbg(&link->dev, "axnet_attach()\n");
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct ei_device) + sizeof(axnet_dev_t));
|
||||
if (!dev)
|
||||
@@ -180,7 +170,6 @@ static int axnet_probe(struct pcmcia_device *link)
|
||||
info->p_dev = link;
|
||||
link->priv = dev;
|
||||
link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
|
||||
link->irq.IRQInfo1 = IRQ_LEVEL_ID;
|
||||
link->conf.Attributes = CONF_ENABLE_IRQ;
|
||||
link->conf.IntType = INT_MEMORY_AND_IO;
|
||||
|
||||
@@ -205,7 +194,7 @@ static void axnet_detach(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
|
||||
DEBUG(0, "axnet_detach(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "axnet_detach(0x%p)\n", link);
|
||||
|
||||
if (link->dev_node)
|
||||
unregister_netdev(dev);
|
||||
@@ -272,9 +261,6 @@ static int get_prom(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 try_io_port(struct pcmcia_device *link)
|
||||
{
|
||||
int j, ret;
|
||||
@@ -341,26 +327,29 @@ static int axnet_config(struct pcmcia_device *link)
|
||||
{
|
||||
struct net_device *dev = link->priv;
|
||||
axnet_dev_t *info = PRIV(dev);
|
||||
int i, j, j2, last_ret, last_fn;
|
||||
int i, j, j2, ret;
|
||||
|
||||
DEBUG(0, "axnet_config(0x%p)\n", link);
|
||||
dev_dbg(&link->dev, "axnet_config(0x%p)\n", link);
|
||||
|
||||
/* don't trust the CIS on this; Linksys got it wrong */
|
||||
link->conf.Present = 0x63;
|
||||
last_ret = pcmcia_loop_config(link, axnet_configcheck, NULL);
|
||||
if (last_ret != 0) {
|
||||
cs_error(link, RequestIO, last_ret);
|
||||
ret = pcmcia_loop_config(link, axnet_configcheck, NULL);
|
||||
if (ret != 0)
|
||||
goto failed;
|
||||
}
|
||||
|
||||
CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
|
||||
ret = pcmcia_request_irq(link, &link->irq);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
if (link->io.NumPorts2 == 8) {
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
link->conf.Status = CCSR_AUDIO_ENA;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@@ -410,7 +399,7 @@ static int axnet_config(struct pcmcia_device *link)
|
||||
|
||||
info->phy_id = (i < 32) ? i : -1;
|
||||
link->dev_node = &info->node;
|
||||
SET_NETDEV_DEV(dev, &handle_to_dev(link));
|
||||
SET_NETDEV_DEV(dev, &link->dev);
|
||||
|
||||
if (register_netdev(dev) != 0) {
|
||||
printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
|
||||
@@ -426,14 +415,12 @@ static int axnet_config(struct pcmcia_device *link)
|
||||
dev->base_addr, dev->irq,
|
||||
dev->dev_addr);
|
||||
if (info->phy_id != -1) {
|
||||
DEBUG(0, " MII transceiver at index %d, status %x.\n", info->phy_id, j);
|
||||
dev_dbg(&link->dev, " MII transceiver at index %d, status %x.\n", info->phy_id, j);
|
||||
} else {
|
||||
printk(KERN_NOTICE " No MII transceivers found!\n");
|
||||
}
|
||||
return 0;
|
||||
|
||||
cs_failed:
|
||||
cs_error(link, last_fn, last_ret);
|
||||
failed:
|
||||
axnet_release(link);
|
||||
return -ENODEV;
|
||||
@@ -543,7 +530,7 @@ static int axnet_open(struct net_device *dev)
|
||||
struct pcmcia_device *link = info->p_dev;
|
||||
unsigned int nic_base = dev->base_addr;
|
||||
|
||||
DEBUG(2, "axnet_open('%s')\n", dev->name);
|
||||
dev_dbg(&link->dev, "axnet_open('%s')\n", dev->name);
|
||||
|
||||
if (!pcmcia_dev_present(link))
|
||||
return -ENODEV;
|
||||
@@ -572,7 +559,7 @@ static int axnet_close(struct net_device *dev)
|
||||
axnet_dev_t *info = PRIV(dev);
|
||||
struct pcmcia_device *link = info->p_dev;
|
||||
|
||||
DEBUG(2, "axnet_close('%s')\n", dev->name);
|
||||
dev_dbg(&link->dev, "axnet_close('%s')\n", dev->name);
|
||||
|
||||
ax_close(dev);
|
||||
free_irq(dev->irq, dev);
|
||||
@@ -741,10 +728,8 @@ static void block_input(struct net_device *dev, int count,
|
||||
int xfer_count = count;
|
||||
char *buf = skb->data;
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
if ((ei_debug > 4) && (count != 4))
|
||||
printk(KERN_DEBUG "%s: [bi=%d]\n", dev->name, count+4);
|
||||
#endif
|
||||
pr_debug("%s: [bi=%d]\n", dev->name, count+4);
|
||||
outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
|
||||
outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
|
||||
outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
|
||||
@@ -762,10 +747,7 @@ static void block_output(struct net_device *dev, int count,
|
||||
{
|
||||
unsigned int nic_base = dev->base_addr;
|
||||
|
||||
#ifdef PCMCIA_DEBUG
|
||||
if (ei_debug > 4)
|
||||
printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
|
||||
#endif
|
||||
pr_debug("%s: [bo=%d]\n", dev->name, count);
|
||||
|
||||
/* Round the count up for word writes. Do we need to do this?
|
||||
What effect will an odd byte count have on the 8390?
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user