* o lanai_change_qos() isn't written yet
*
* o There aren't any ioctl's yet -- I'd like to eventually support
- * setting loopback and LED modes that way. (see lanai_ioctl)
+ * setting loopback and LED modes that way.
*
* o If the segmentation engine or DMA gets shut down we should restart
* card as per section 17.0i. (see lanai_reset)
#include <asm/byteorder.h>
#include <linux/spinlock.h>
#include <linux/pci.h>
+#include <linux/dma-mapping.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
/* -------------------- TUNABLE PARAMATERS: */
* vci with their bit set
*/
static void vci_bitfield_iterate(struct lanai_dev *lanai,
- /*const*/ unsigned long *lp,
+ const unsigned long *lp,
void (*func)(struct lanai_dev *,vci_t vci))
{
vci_t vci = find_first_bit(lp, NUM_VCI);
return -EIO;
}
-static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
+static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
{
int offset, result = 0;
for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4)
return result;
}
-static int __init sram_test_and_clear(const struct lanai_dev *lanai)
+static int __devinit sram_test_and_clear(const struct lanai_dev *lanai)
{
#ifdef FULL_MEMORY_TEST
int result;
enum lanai_vcc_offset offset)
{
u32 val;
- APRINTK(lvcc->vbase != 0, "cardvcc_read: unbound vcc!\n");
+ APRINTK(lvcc->vbase != NULL, "cardvcc_read: unbound vcc!\n");
val= readl(lvcc->vbase + offset);
RWDEBUG("VR vci=%04d 0x%02X = 0x%08X\n",
lvcc->vci, (int) offset, val);
static inline void cardvcc_write(const struct lanai_vcc *lvcc,
u32 val, enum lanai_vcc_offset offset)
{
- APRINTK(lvcc->vbase != 0, "cardvcc_write: unbound vcc!\n");
+ APRINTK(lvcc->vbase != NULL, "cardvcc_write: unbound vcc!\n");
APRINTK((val & ~0xFFFF) == 0,
"cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)\n",
(unsigned int) val, lvcc->vci, (unsigned int) offset);
/* Shutdown receiving on card */
static void lanai_shutdown_rx_vci(const struct lanai_vcc *lvcc)
{
- if (lvcc->vbase == 0) /* We were never bound to a VCI */
+ if (lvcc->vbase == NULL) /* We were never bound to a VCI */
return;
/* 15.1.1 - set to trashing, wait one cell time (15us) */
cardvcc_write(lvcc,
int read, write, lastread = -1;
APRINTK(!in_interrupt(),
"lanai_shutdown_tx_vci called w/o process context!\n");
- if (lvcc->vbase == 0) /* We were never bound to a VCI */
+ if (lvcc->vbase == NULL) /* We were never bound to a VCI */
return;
/* 15.2.1 - wait for queue to drain */
while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL)
#ifndef READ_EEPROM
/* Stub functions to use if EEPROM reading is disabled */
-static int __init eeprom_read(struct lanai_dev *lanai)
+static int __devinit eeprom_read(struct lanai_dev *lanai)
{
printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n",
lanai->number);
return 0;
}
-static int __init eeprom_validate(struct lanai_dev *lanai)
+static int __devinit eeprom_validate(struct lanai_dev *lanai)
{
lanai->serialno = 0;
lanai->magicno = EEPROM_MAGIC_VALUE;
#else /* READ_EEPROM */
-static int __init eeprom_read(struct lanai_dev *lanai)
+static int __devinit eeprom_read(struct lanai_dev *lanai)
{
int i, address;
u8 data;
/* read a big-endian 4-byte value out of eeprom */
static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
{
- return be32_to_cpup((u32 *) (&lanai->eeprom[address]));
+ return be32_to_cpup((const u32 *) &lanai->eeprom[address]);
}
/* Checksum/validate EEPROM contents */
-static int __init eeprom_validate(struct lanai_dev *lanai)
+static int __devinit eeprom_validate(struct lanai_dev *lanai)
{
int i, s;
u32 v;
}
/* test if VCC is currently backlogged */
-static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc)
+static inline int vcc_is_backlogged(const struct lanai_vcc *lvcc)
{
return !skb_queue_empty(&lvcc->tx.backlog);
}
{
int size;
struct sk_buff *skb;
- /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4];
+ const u32 *x;
+ u32 *end = &lvcc->rx.buf.start[endptr * 4];
int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr);
if (n < 0)
n += lanai_buf_size(&lvcc->rx.buf);
skb_put(skb, size);
vcc_rx_memcpy(skb->data, lvcc, size);
ATM_SKB(skb)->vcc = lvcc->rx.atmvcc;
- do_gettimeofday(&skb->stamp);
+ __net_timestamp(skb);
lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb);
atomic_inc(&lvcc->rx.atmvcc->stats->rx);
out:
#include <linux/vmalloc.h>
#endif
-static int __init vcc_table_allocate(struct lanai_dev *lanai)
+static int __devinit vcc_table_allocate(struct lanai_dev *lanai)
{
#ifdef VCCTABLE_GETFREEPAGE
APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE,
static inline struct lanai_vcc *new_lanai_vcc(void)
{
struct lanai_vcc *lvcc;
- lvcc = (struct lanai_vcc *) kmalloc(sizeof(*lvcc), GFP_KERNEL);
+ lvcc = kzalloc(sizeof(*lvcc), GFP_KERNEL);
if (likely(lvcc != NULL)) {
- lvcc->vbase = NULL;
- lvcc->rx.atmvcc = lvcc->tx.atmvcc = NULL;
- lvcc->nref = 0;
- memset(&lvcc->stats, 0, sizeof lvcc->stats);
- lvcc->rx.buf.start = lvcc->tx.buf.start = NULL;
skb_queue_head_init(&lvcc->tx.backlog);
#ifdef DEBUG
- lvcc->tx.unqueue = NULL;
lvcc->vci = -1;
#endif
}
static inline void host_vcc_bind(struct lanai_dev *lanai,
struct lanai_vcc *lvcc, vci_t vci)
{
- if (lvcc->vbase != 0)
+ if (lvcc->vbase != NULL)
return; /* We already were bound in the other direction */
DPRINTK("Binding vci %d\n", vci);
#ifdef USE_POWERDOWN
static inline void host_vcc_unbind(struct lanai_dev *lanai,
struct lanai_vcc *lvcc)
{
- if (lvcc->vbase == 0)
+ if (lvcc->vbase == NULL)
return; /* This vcc was never bound */
DPRINTK("Unbinding vci %d\n", lvcc->vci);
lvcc->vbase = NULL;
/*
* Allocate service buffer and tell card about it
*/
-static int __init service_buffer_allocate(struct lanai_dev *lanai)
+static int __devinit service_buffer_allocate(struct lanai_dev *lanai)
{
lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8,
lanai->pci);
reg_write(lanai, ack, IntAck_Reg);
}
-static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
+static irqreturn_t lanai_int(int irq, void *devid)
{
- struct lanai_dev *lanai = (struct lanai_dev *) devid;
+ struct lanai_dev *lanai = devid;
u32 reason;
- (void) irq; (void) regs; /* unused variables */
-
#ifdef USE_POWERDOWN
/*
* If we're powered down we shouldn't be generating any interrupts -
/* -------------------- PCI INITIALIZATION/SHUTDOWN: */
-static int __init lanai_pci_start(struct lanai_dev *lanai)
+static int __devinit lanai_pci_start(struct lanai_dev *lanai)
{
struct pci_dev *pci = lanai->pci;
int result;
return -ENXIO;
}
pci_set_master(pci);
- if (pci_set_dma_mask(pci, 0xFFFFFFFF) != 0) {
+ if (pci_set_dma_mask(pci, DMA_32BIT_MASK) != 0) {
printk(KERN_WARNING DEV_LABEL
"(itf %d): No suitable DMA available.\n", lanai->number);
return -EBUSY;
}
- if (pci_set_consistent_dma_mask(pci, 0xFFFFFFFF) != 0) {
+ if (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) != 0) {
printk(KERN_WARNING DEV_LABEL
"(itf %d): No suitable DMA available.\n", lanai->number);
return -EBUSY;
* shifted by that much as we compute
*
*/
-static int pcr_to_cbricg(/*const*/ struct atm_qos *qos)
+static int pcr_to_cbricg(const struct atm_qos *qos)
{
int rounddown = 0; /* 1 = Round PCR down, i.e. round ICG _up_ */
int x, icg, pcr = atm_pcr_goal(&qos->txtp);
/* -------------------- OPERATIONS: */
/* setup a newly detected device */
-static int __init lanai_dev_open(struct atm_dev *atmdev)
+static int __devinit lanai_dev_open(struct atm_dev *atmdev)
{
struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
unsigned long raw_base;
goto error;
raw_base = lanai->pci->resource[0].start;
lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE);
- if (lanai->base == 0) {
+ if (lanai->base == NULL) {
printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n");
goto error_pci;
}
conf2_write(lanai);
reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg);
reg_write(lanai, 0, CBR_ICG_Reg); /* CBR defaults to no limit */
- if ((result = request_irq(lanai->pci->irq, lanai_int, SA_SHIRQ,
+ if ((result = request_irq(lanai->pci->irq, lanai_int, IRQF_SHARED,
DEV_LABEL, lanai)) != 0) {
printk(KERN_ERR DEV_LABEL ": can't allocate interrupt\n");
goto error_vcctable;
}
if (lvcc->tx.atmvcc == atmvcc) {
if (atmvcc == lanai->cbrvcc) {
- if (lvcc->vbase != 0)
+ if (lvcc->vbase != NULL)
lanai_cbr_shutdown(lanai);
lanai->cbrvcc = NULL;
}
return result;
}
-#if 0
-/* ioctl operations for card */
-/* NOTE: these are all DEBUGGING ONLY currently */
-static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void __user *arg)
-{
- int result = 0;
- struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
- switch(cmd) {
- case 2106275:
- shutdown_atm_dev(atmdev);
- return 0;
- case 2200000: {
- unsigned long flags;
- spin_lock_irqsave(&lanai->servicelock, flags);
- run_service(lanai);
- spin_unlock_irqrestore(&lanai->servicelock, flags);
- return 0; }
- case 2200002:
- get_statistics(lanai);
- return 0;
- case 2200003: {
- unsigned int i;
- for (i = 0; i <= 0x5C ; i += 4) {
- if (i==0x48) /* Write-only butt reg */
- continue;
- printk(KERN_CRIT DEV_LABEL " 0x%02X: "
- "0x%08X\n", i,
- (unsigned int) readl(lanai->base + i));
- barrier(); mb();
- pcistatus_check(lanai, 0);
- barrier(); mb();
- }
- return 0; }
- case 2200004: {
- u8 b;
- u16 w;
- u32 dw;
- struct pci_dev *pci = lanai->pci;
- (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
- DPRINTK("vendor = 0x%X\n", (unsigned int) w);
- (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
- DPRINTK("device = 0x%X\n", (unsigned int) w);
- (void) pci_read_config_word(pci, PCI_COMMAND, &w);
- DPRINTK("command = 0x%X\n", (unsigned int) w);
- (void) pci_read_config_word(pci, PCI_STATUS, &w);
- DPRINTK("status = 0x%X\n", (unsigned int) w);
- (void) pci_read_config_dword(pci,
- PCI_CLASS_REVISION, &dw);
- DPRINTK("class/revision = 0x%X\n", (unsigned int) dw);
- (void) pci_read_config_byte(pci,
- PCI_CACHE_LINE_SIZE, &b);
- DPRINTK("cache line size = 0x%X\n", (unsigned int) b);
- (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
- DPRINTK("latency = %d (0x%X)\n",
- (int) b, (unsigned int) b);
- (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
- DPRINTK("header type = 0x%X\n", (unsigned int) b);
- (void) pci_read_config_byte(pci, PCI_BIST, &b);
- DPRINTK("bist = 0x%X\n", (unsigned int) b);
- /* skipping a few here */
- (void) pci_read_config_byte(pci,
- PCI_INTERRUPT_LINE, &b);
- DPRINTK("pci_int_line = 0x%X\n", (unsigned int) b);
- (void) pci_read_config_byte(pci,
- PCI_INTERRUPT_PIN, &b);
- DPRINTK("pci_int_pin = 0x%X\n", (unsigned int) b);
- (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
- DPRINTK("min_gnt = 0x%X\n", (unsigned int) b);
- (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
- DPRINTK("max_lat = 0x%X\n", (unsigned int) b); }
- return 0;
-#ifdef USE_POWERDOWN
- case 2200005:
- DPRINTK("Coming out of powerdown\n");
- lanai->conf1 &= ~CONFIG1_POWERDOWN;
- conf1_write(lanai);
- return 0;
-#endif
- default:
- result = -ENOIOCTLCMD;
- }
- return result;
-}
-#else /* !0 */
-#define lanai_ioctl NULL
-#endif /* 0 */
-
static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
{
struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
unsigned long flags;
- if (unlikely(lvcc == NULL || lvcc->vbase == 0 ||
+ if (unlikely(lvcc == NULL || lvcc->vbase == NULL ||
lvcc->tx.atmvcc != atmvcc))
goto einval;
#ifdef DEBUG
.dev_close = lanai_dev_close,
.open = lanai_open,
.close = lanai_close,
- .ioctl = lanai_ioctl,
.getsockopt = NULL,
.setsockopt = NULL,
.send = lanai_send,
struct atm_dev *atmdev;
int result;
- lanai = (struct lanai_dev *) kmalloc(sizeof(*lanai), GFP_KERNEL);
+ lanai = kmalloc(sizeof(*lanai), GFP_KERNEL);
if (lanai == NULL) {
printk(KERN_ERR DEV_LABEL
": couldn't allocate dev_data structure!\n");
{
int x;
- x = pci_module_init(&lanai_driver);
+ x = pci_register_driver(&lanai_driver);
if (x != 0)
printk(KERN_ERR DEV_LABEL ": no adapter found\n");
return x;
* gone, so there isn't much to do
*/
DPRINTK("cleanup_module()\n");
+ pci_unregister_driver(&lanai_driver);
}
module_init(lanai_module_init);