** This driver has only been tested with
** -- HP J2585B 10/100 Mbit/s PCI Busmaster
** -- HP J2585A 10/100 Mbit/s PCI
-** -- HP J2970 10 Mbit/s PCI Combo 10base-T/BNC
-** -- HP J2973 10 Mbit/s PCI 10base-T
+** -- HP J2970A 10 Mbit/s PCI Combo 10base-T/BNC
+** -- HP J2973A 10 Mbit/s PCI 10base-T
** -- HP J2573 10/100 ISA
** -- Compex ReadyLink ENET100-VG4 10/100 Mbit/s PCI / EISA
** -- Compex FreedomLine 100/VG 10/100 Mbit/s ISA / EISA / PCI
#undef HP100_MULTICAST_FILTER /* Need to be debugged... */
-#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/interrupt.h>
#include <linux/eisa.h>
#include <linux/pci.h>
+#include <linux/dma-mapping.h>
#include <linux/spinlock.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/bitops.h>
+#include <linux/jiffies.h>
#include <asm/io.h>
static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX;
static int hp100_mode = 1;
-MODULE_PARM(hp100_rx_ratio, "1i");
-MODULE_PARM(hp100_priority_tx, "1i");
-MODULE_PARM(hp100_mode, "1i");
+module_param(hp100_rx_ratio, int, 0);
+module_param(hp100_priority_tx, int, 0);
+module_param(hp100_mode, int, 0);
/*
* prototypes
* Convert an address in a kernel buffer to a bus/phys/dma address.
* This work *only* for memory fragments part of lp->page_vaddr,
* because it was properly DMA allocated via pci_alloc_consistent(),
- * so we just need to "retreive" the original mapping to bus/phys/dma
+ * so we just need to "retrieve" the original mapping to bus/phys/dma
* address - Jean II */
static inline dma_addr_t virt_to_whatever(struct net_device *dev, u32 * ptr)
{
- return ((u_long) ptr) +
- ((struct hp100_private *) (dev->priv))->whatever_offset;
+ struct hp100_private *lp = netdev_priv(dev);
+ return ((u_long) ptr) + lp->whatever_offset;
+}
+
+static inline u_int pdl_map_data(struct hp100_private *lp, void *data)
+{
+ return pci_map_single(lp->pci_dev, data,
+ MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
}
/* TODO: This function should not really be needed in a good design... */
* Read board id and convert to string.
* Effectively same code as decode_eisa_sig
*/
-static __init const char *hp100_read_id(int ioaddr)
+static __devinit const char *hp100_read_id(int ioaddr)
{
int i;
static char str[HP100_SIG_LEN];
if (err)
goto out;
- err = register_netdev(dev);
- if (err)
- goto out1;
return dev;
- out1:
- release_region(dev->base_addr, HP100_REGION_SIZE);
out:
free_netdev(dev);
return ERR_PTR(err);
}
#endif
-static int __init hp100_probe1(struct net_device *dev, int ioaddr,
- u_char bus, struct pci_dev *pci_dev)
+static int __devinit hp100_probe1(struct net_device *dev, int ioaddr,
+ u_char bus, struct pci_dev *pci_dev)
{
int i;
int err = -ENODEV;
* Also, we can have EISA Busmaster cards (not tested),
* so beware !!! - Jean II */
if((bus == HP100_BUS_PCI) &&
- (pci_set_dma_mask(pci_dev, 0xffffffff))) {
+ (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK))) {
/* Gracefully fallback to shared memory */
goto busmasterfail;
}
}
/* Initialise the "private" data structure for this card. */
- lp = (struct hp100_private *) dev->priv;
+ lp = netdev_priv(dev);
spin_lock_init(&lp->lock);
strlcpy(lp->id, eid, HP100_SIG_LEN);
printk("Warning! Link down.\n");
}
+ err = register_netdev(dev);
+ if (err)
+ goto out3;
+
return 0;
+out3:
+ if (local_mode == 1)
+ pci_free_consistent(lp->pci_dev, MAX_RINGSIZE + 0x0f,
+ lp->page_vaddr_algn,
+ virt_to_whatever(dev, lp->page_vaddr_algn));
+ if (mem_ptr_virt)
+ iounmap(mem_ptr_virt);
out2:
release_region(ioaddr, HP100_REGION_SIZE);
out1:
- return -ENODEV;
+ return err;
}
/* This procedure puts the card into a stable init state */
static void hp100_hwinit(struct net_device *dev)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4202, TRACE);
static void hp100_mmuinit(struct net_device *dev)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
int i;
#ifdef HP100_DEBUG_B
static int hp100_open(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
int ioaddr = dev->base_addr;
#endif
static int hp100_close(struct net_device *dev)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4205, TRACE);
*/
static void hp100_init_pdls(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
hp100_ring_t *ringptr;
u_int *pageptr; /* Warning : increment by 4 - Jean II */
int i;
/* Conversion to new PCI API : map skbuf data to PCI bus.
* Doc says it's OK for EISA as well - Jean II */
ringptr->pdl[0] = 0x00020000; /* Write PDH */
- ringptr->pdl[3] = ((u_int) pci_map_single(((struct hp100_private *) (dev->priv))->pci_dev, ringptr->skb->data, MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE));
+ ringptr->pdl[3] = pdl_map_data(netdev_priv(dev),
+ ringptr->skb->data);
ringptr->pdl[4] = MAX_ETHER_SIZE; /* Length of Data */
#ifdef HP100_DEBUG_BM
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
hp100_ring_t *ringptr;
#ifdef HP100_DEBUG_B
static void hp100_BM_shutdown(struct net_device *dev)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
unsigned long time;
#ifdef HP100_DEBUG_B
static int hp100_check_lan(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
if (lp->lan_type < 0) { /* no LAN type detected yet? */
hp100_stop_interface(dev);
unsigned long flags;
int i, ok_flag;
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
hp100_ring_t *ringptr;
#ifdef HP100_DEBUG_B
printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name);
#endif
/* not waited long enough since last tx? */
- if (jiffies - dev->trans_start < HZ)
+ if (time_before(jiffies, dev->trans_start + HZ))
return -EAGAIN;
if (hp100_check_lan(dev))
*/
static void hp100_clean_txring(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
int ioaddr = dev->base_addr;
int donecount;
int i, ok_flag;
int ioaddr = dev->base_addr;
u_short val;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4212, TRACE);
printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i);
#endif
/* not waited long enough since last failed tx try? */
- if (jiffies - dev->trans_start < HZ) {
+ if (time_before(jiffies, dev->trans_start + HZ)) {
#ifdef HP100_DEBUG
printk("hp100: %s: trans_start timing problem\n",
dev->name);
hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */
if (lp->mode == 2) { /* memory mapped */
- if (lp->mem_ptr_virt) { /* high pci memory was remapped */
- /* Note: The J2585B needs alignment to 32bits here! */
- memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
- if (!ok_flag)
- memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
- } else {
- /* Note: The J2585B needs alignment to 32bits here! */
- isa_memcpy_toio(lp->mem_ptr_phys, skb->data, (skb->len + 3) & ~3);
- if (!ok_flag)
- isa_memset_io(lp->mem_ptr_phys, 0, HP100_MIN_PACKET_SIZE - skb->len);
- }
+ /* Note: The J2585B needs alignment to 32bits here! */
+ memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
+ if (!ok_flag)
+ memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
} else { /* programmed i/o */
outsl(ioaddr + HP100_REG_DATA32, skb->data,
(skb->len + 3) >> 2);
{
int packets, pkt_len;
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
u_int header;
struct sk_buff *skb;
/* First we get the header, which contains information about the */
/* actual length of the received packet. */
if (lp->mode == 2) { /* memory mapped mode */
- if (lp->mem_ptr_virt) /* if memory was remapped */
- header = readl(lp->mem_ptr_virt);
- else
- header = isa_readl(lp->mem_ptr_phys);
+ header = readl(lp->mem_ptr_virt);
} else /* programmed i/o */
header = hp100_inl(DATA32);
ptr = skb->data;
/* Now transfer the data from the card into that area */
- if (lp->mode == 2) {
- if (lp->mem_ptr_virt)
- memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
- /* Note alignment to 32bit transfers */
- else
- isa_memcpy_fromio(ptr, lp->mem_ptr_phys, pkt_len);
- } else /* io mapped */
+ if (lp->mode == 2)
+ memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
+ else /* io mapped */
insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
skb->protocol = eth_type_trans(skb, dev);
static void hp100_rx_bm(struct net_device *dev)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
hp100_ring_t *ptr;
u_int header;
int pkt_len;
{
unsigned long flags;
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4215, TRACE);
{
int ioaddr = dev->base_addr;
u_short val;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4216, TRACE);
#ifdef HP100_DEBUG_B
int ioaddr = dev->base_addr;
#endif
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
int ioaddr = dev->base_addr;
{
unsigned long flags;
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4218, TRACE);
static irqreturn_t hp100_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct net_device *dev = (struct net_device *) dev_id;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
int ioaddr;
u_int val;
{
unsigned long flags;
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4220, TRACE);
static void hp100_stop_interface(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
int ioaddr = dev->base_addr;
u_int val;
{
int ioaddr = dev->base_addr;
u_short val_VG, val_10;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4223, TRACE);
static int hp100_down_vg_link(struct net_device *dev)
{
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
int ioaddr = dev->base_addr;
unsigned long time;
long savelan, newlan;
do {
if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
if (time_after_eq(jiffies, time)) /* no signal->no logout */
do {
if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
#ifdef HP100_DEBUG
do {
if (!(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST))
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
hp100_orb(HP100_AUTO_MODE, MAC_CFG_3); /* Autosel back on */
do {
if ((hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) == 0)
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
if (time_before_eq(time, jiffies)) {
time = jiffies + (2 * HZ); /* This seems to take a while.... */
do {
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
return 0;
static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
u_short val = 0;
unsigned long time;
int startst;
do {
if (~(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
/* Start an addressed training and optionally request promiscuous port */
do {
if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
break;
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_before(jiffies, time));
if (time_after_eq(jiffies, time)) {
#endif
break;
}
- if (!in_interrupt()) {
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(1);
- }
+ if (!in_interrupt())
+ schedule_timeout_interruptible(1);
} while (time_after(time, jiffies));
}
static void hp100_cascade_reset(struct net_device *dev, u_short enable)
{
int ioaddr = dev->base_addr;
- struct hp100_private *lp = (struct hp100_private *) dev->priv;
+ struct hp100_private *lp = netdev_priv(dev);
#ifdef HP100_DEBUG_B
hp100_outw(0x4226, TRACE);
static void cleanup_dev(struct net_device *d)
{
- struct hp100_private *p = (struct hp100_private *) d->priv;
+ struct hp100_private *p = netdev_priv(d);
unregister_netdev(d);
release_region(d->base_addr, HP100_REGION_SIZE);
if (err)
goto out1;
- err = register_netdev(dev);
- if (err)
- goto out2;
-
#ifdef HP100_DEBUG
printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
dev->base_addr);
#endif
gendev->driver_data = dev;
return 0;
- out2:
- release_region(dev->base_addr, HP100_REGION_SIZE);
out1:
free_netdev(dev);
return err;
err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev);
if (err)
goto out1;
- err = register_netdev(dev);
- if (err)
- goto out2;
#ifdef HP100_DEBUG
printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
#endif
pci_set_drvdata(pdev, dev);
return 0;
- out2:
- release_region(dev->base_addr, HP100_REGION_SIZE);
out1:
free_netdev(dev);
out0:
#define HP100_DEVICES 5
/* Parameters set by insmod */
static int hp100_port[HP100_DEVICES] = { 0, [1 ... (HP100_DEVICES-1)] = -1 };
-MODULE_PARM(hp100_port, "1-" __MODULE_STRING(HP100_DEVICES) "i");
+module_param_array(hp100_port, int, NULL, 0);
/* List of devices */
static struct net_device *hp100_devlist[HP100_DEVICES];
SET_MODULE_OWNER(dev);
err = hp100_isa_probe(dev, hp100_port[i]);
- if (!err) {
- err = register_netdev(dev);
- if (!err)
- hp100_devlist[cards++] = dev;
- else
- release_region(dev->base_addr, HP100_REGION_SIZE);
- }
-
- if (err)
+ if (!err)
+ hp100_devlist[cards++] = dev;
+ else
free_netdev(dev);
}