patch-2.4.21 linux-2.4.21/drivers/net/wireless/orinoco_pci.c
Next file: linux-2.4.21/drivers/net/wireless/orinoco_plx.c
Previous file: linux-2.4.21/drivers/net/wireless/orinoco_cs.c
Back to the patch index
Back to the overall index
- Lines: 262
- Date:
2003-06-13 07:51:35.000000000 -0700
- Orig file:
linux-2.4.20/drivers/net/wireless/orinoco_pci.c
- Orig date:
2002-08-02 17:39:44.000000000 -0700
diff -urN linux-2.4.20/drivers/net/wireless/orinoco_pci.c linux-2.4.21/drivers/net/wireless/orinoco_pci.c
@@ -1,4 +1,4 @@
-/* orinoco_pci.c 0.01
+/* orinoco_pci.c 0.13b
*
* Driver for Prism II devices that have a direct PCI interface
* (i.e., not in a Pcmcia or PLX bridge)
@@ -10,8 +10,10 @@
* Some of this code is "inspired" by linux-wlan-ng-0.1.10, but nothing
* has been copied from it. linux-wlan-ng-0.1.10 is originally :
* Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved.
- * The rest is :
+ * This file originally written by:
* Copyright (C) 2001 Jean Tourrilhes <jt@hpl.hp.com>
+ * And is now maintained by:
+ * Copyright (C) 2002 David Gibson, IBM Corporation <herme@gibson.dropbear.id.au>
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
@@ -97,7 +99,6 @@
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/system.h>
-#include <linux/proc_fs.h>
#include <linux/netdevice.h>
#include <linux/if_arp.h>
#include <linux/etherdevice.h>
@@ -122,41 +123,6 @@
#define HERMES_PCI_COR_OFFT (500) /* ms */
#define HERMES_PCI_COR_BUSYT (500) /* ms */
-MODULE_AUTHOR("Jean Tourrilhes <jt@hpl.hp.com>");
-MODULE_DESCRIPTION("Driver for wireless LAN cards using direct PCI interface");
-MODULE_LICENSE("Dual MPL/GPL");
-
-static int orinoco_pci_open(struct net_device *dev)
-{
- struct orinoco_private *priv = (struct orinoco_private *) dev->priv;
- int err;
-
- netif_device_attach(dev);
-
- err = orinoco_reset(priv);
- if (err)
- printk(KERN_ERR "%s: orinoco_reset failed in orinoco_pci_open()",
- dev->name);
- else
- netif_start_queue(dev);
-
- return err;
-}
-
-static int orinoco_pci_stop(struct net_device *dev)
-{
- struct orinoco_private *priv = (struct orinoco_private *) dev->priv;
- netif_stop_queue(dev);
- orinoco_shutdown(priv);
- return 0;
-}
-
-static void
-orinoco_pci_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
- orinoco_interrupt(irq, (struct orinoco_private *)dev_id, regs);
-}
-
/*
* Do a soft reset of the PCI card using the Configuration Option Register
* We need this to get going...
@@ -179,7 +145,6 @@
TRACE_ENTER(priv->ndev->name);
-
/* Assert the reset until the card notice */
hermes_write_regn(hw, PCI_COR, HERMES_PCI_COR_MASK);
printk(KERN_NOTICE "Reset done");
@@ -235,8 +200,6 @@
struct net_device *dev = NULL;
int netdev_registered = 0;
- TRACE_ENTER("orinoco_pci");
-
err = pci_enable_device(pdev);
if (err)
return -EIO;
@@ -249,7 +212,7 @@
goto fail;
/* Usual setup of structures */
- dev = alloc_orinocodev(0);
+ dev = alloc_orinocodev(0, NULL);
if (! dev) {
err = -ENOMEM;
goto fail;
@@ -259,9 +222,6 @@
dev->base_addr = (int) pci_ioaddr;
dev->mem_start = (unsigned long) pci_iorange;
dev->mem_end = ((unsigned long) pci_iorange) + pci_iolen - 1;
- dev->open = orinoco_pci_open;
- dev->stop = orinoco_pci_stop;
-/* priv->card_reset_handler = orinoco_pci_cor_reset; */
SET_MODULE_OWNER(dev);
@@ -272,7 +232,7 @@
hermes_struct_init(&(priv->hw), dev->base_addr, HERMES_MEM, HERMES_32BIT_REGSPACING);
pci_set_drvdata(pdev, dev);
- err = request_irq(pdev->irq, orinoco_pci_interrupt, SA_SHIRQ, dev->name, priv);
+ err = request_irq(pdev->irq, orinoco_interrupt, SA_SHIRQ, dev->name, priv);
if (err) {
printk(KERN_ERR "orinoco_pci: Error allocating IRQ %d.\n", pdev->irq);
err = -EBUSY;
@@ -291,25 +251,15 @@
priv->firmware_type = FIRMWARE_TYPE_INTERSIL;
err = register_netdev(dev);
- if (err)
- goto fail;
- netdev_registered = 1;
-
- err = orinoco_proc_dev_init(priv);
if (err) {
- printk(KERN_ERR "%s: Failed to create /proc node\n", dev->name);
- err = -EIO;
+ printk(KERN_ERR "%s: Failed to register net device\n", dev->name);
goto fail;
}
-
- TRACE_EXIT("orinoco_pci");
+ netdev_registered = 1;
return 0; /* succeeded */
fail:
- printk(KERN_DEBUG "orinoco_pci: init_one(), FAIL!\n");
-
if (dev) {
- orinoco_proc_dev_cleanup(priv);
if (netdev_registered)
unregister_netdev(dev);
@@ -330,13 +280,9 @@
struct net_device *dev = pci_get_drvdata(pdev);
struct orinoco_private *priv = dev->priv;
- TRACE_ENTER("orinoco_pci");
-
if (! dev)
BUG();
- orinoco_proc_dev_cleanup(priv);
-
unregister_netdev(dev);
if (dev->irq)
@@ -345,13 +291,76 @@
if (priv->hw.iobase)
iounmap((unsigned char *) priv->hw.iobase);
+ pci_set_drvdata(pdev, NULL);
kfree(dev);
pci_disable_device(pdev);
+}
+
+static int orinoco_pci_suspend(struct pci_dev *pdev, u32 state)
+{
+ struct net_device *dev = pci_get_drvdata(pdev);
+ struct orinoco_private *priv = dev->priv;
+ unsigned long flags;
+ int err;
+
+ printk(KERN_DEBUG "%s: Orinoco-PCI entering sleep mode (state=%d)\n",
+ dev->name, state);
+
+ err = orinoco_lock(priv, &flags);
+ if (err) {
+ printk(KERN_ERR "%s: hw_unavailable on orinoco_pci_suspend\n",
+ dev->name);
+ return err;
+ }
+
+ err = __orinoco_down(dev);
+ if (err)
+ printk(KERN_WARNING "%s: orinoco_pci_suspend(): Error %d downing interface\n",
+ dev->name, err);
+
+ netif_device_detach(dev);
+
+ priv->hw_unavailable = 1;
+
+ orinoco_unlock(priv, &flags);
- TRACE_EXIT("orinoco_pci");
+ return 0;
}
+static int orinoco_pci_resume(struct pci_dev *pdev)
+{
+ struct net_device *dev = pci_get_drvdata(pdev);
+ struct orinoco_private *priv = dev->priv;
+ unsigned long flags;
+ int err;
+
+ printk(KERN_DEBUG "%s: Orinoco-PCI waking up\n", dev->name);
+
+ err = orinoco_reinit_firmware(dev);
+ if (err) {
+ printk(KERN_ERR "%s: Error %d re-initializing firmware on orinoco_pci_resume()\n",
+ dev->name, err);
+ return err;
+ }
+
+ spin_lock_irqsave(&priv->lock, flags);
+
+ netif_device_attach(dev);
+
+ if (priv->open) {
+ err = __orinoco_up(dev);
+ if (err)
+ printk(KERN_ERR "%s: Error %d restarting card on orinoco_pci_resume()\n",
+ dev->name, err);
+ }
+
+ priv->hw_unavailable = 0;
+
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+ return 0;
+}
static struct pci_device_id orinoco_pci_pci_id_table[] __devinitdata = {
{0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID,},
@@ -361,16 +370,22 @@
MODULE_DEVICE_TABLE(pci, orinoco_pci_pci_id_table);
static struct pci_driver orinoco_pci_driver = {
- name:"orinoco_pci",
- id_table:orinoco_pci_pci_id_table,
- probe:orinoco_pci_init_one,
- remove:__devexit_p(orinoco_pci_remove_one),
- suspend:0,
- resume:0
+ .name = "orinoco_pci",
+ .id_table = orinoco_pci_pci_id_table,
+ .probe = orinoco_pci_init_one,
+ .remove = __devexit_p(orinoco_pci_remove_one),
+ .suspend = orinoco_pci_suspend,
+ .resume = orinoco_pci_resume,
};
+static char version[] __initdata = "orinoco_pci.c 0.13b (David Gibson <hermes@gibson.dropbear.id.au> & Jean Tourrilhes <jt@hpl.hp.com>)";
+MODULE_AUTHOR("David Gibson <hermes@gibson.dropbear.id.au>");
+MODULE_DESCRIPTION("Driver for wireless LAN cards using direct PCI interface");
+MODULE_LICENSE("Dual MPL/GPL");
+
static int __init orinoco_pci_init(void)
{
+ printk(KERN_DEBUG "%s\n", version);
return pci_module_init(&orinoco_pci_driver);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)