//#define dprintk printk
#define dprintk(x...) do { } while (0)
+#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/timer.h>
#include <linux/if_vlan.h>
#include <linux/rtnetlink.h>
-#include <linux/jiffies.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#endif
sg = dev->rx_info.descs + (next_empty * DESC_SIZE);
- BUG_ON(NULL != dev->rx_info.skbs[next_empty]);
+ if (unlikely(NULL != dev->rx_info.skbs[next_empty]))
+ BUG();
dev->rx_info.skbs[next_empty] = skb;
dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC;
static void fastcall phy_intr(struct net_device *ndev)
{
struct ns83820 *dev = PRIV(ndev);
- static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
+ static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
u32 cfg, new_cfg;
u32 tbisr, tanar, tanlpar;
int speed, fullduplex, newlinkstate;
writel(dev->IMR_cache, dev->base + IMR);
writel(1, dev->base + IER);
- spin_unlock(&dev->misc_lock);
+ spin_unlock_irq(&dev->misc_lock);
kick_rx(ndev);
struct ns83820 *dev = PRIV(ndev);
u32 cmdsts, tx_done_idx, *desc;
+ spin_lock_irq(&dev->tx_lock);
+
dprintk("do_tx_done(%p)\n", ndev);
tx_done_idx = dev->tx_done_idx;
desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
netif_start_queue(ndev);
netif_wake_queue(ndev);
}
+ spin_unlock_irq(&dev->tx_lock);
}
static void ns83820_cleanup_tx(struct ns83820 *dev)
.get_link = ns83820_get_link
};
-/* this function is called in irq context from the ISR */
static void ns83820_mib_isr(struct ns83820 *dev)
{
- unsigned long flags;
- spin_lock_irqsave(&dev->misc_lock, flags);
+ spin_lock(&dev->misc_lock);
ns83820_update_stats(dev);
- spin_unlock_irqrestore(&dev->misc_lock, flags);
+ spin_unlock(&dev->misc_lock);
}
static void ns83820_do_isr(struct net_device *ndev, u32 isr);
static void ns83820_do_isr(struct net_device *ndev, u32 isr)
{
struct ns83820 *dev = PRIV(ndev);
- unsigned long flags;
-
#ifdef DEBUG
if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC))
Dprintk("odd isr? 0x%08x\n", isr);
if ((ISR_RXDESC | ISR_RXOK) & isr) {
prefetch(dev->rx_info.next_rx_desc);
- spin_lock_irqsave(&dev->misc_lock, flags);
+ spin_lock_irq(&dev->misc_lock);
dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK);
writel(dev->IMR_cache, dev->base + IMR);
- spin_unlock_irqrestore(&dev->misc_lock, flags);
+ spin_unlock_irq(&dev->misc_lock);
tasklet_schedule(&dev->rx_tasklet);
//rx_irq(ndev);
* work has accumulated
*/
if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) {
- spin_lock_irqsave(&dev->tx_lock, flags);
do_tx_done(ndev);
- spin_unlock_irqrestore(&dev->tx_lock, flags);
/* Disable TxOk if there are no outstanding tx packets.
*/
if ((dev->tx_done_idx == dev->tx_free_idx) &&
(dev->IMR_cache & ISR_TXOK)) {
- spin_lock_irqsave(&dev->misc_lock, flags);
+ spin_lock_irq(&dev->misc_lock);
dev->IMR_cache &= ~ISR_TXOK;
writel(dev->IMR_cache, dev->base + IMR);
- spin_unlock_irqrestore(&dev->misc_lock, flags);
+ spin_unlock_irq(&dev->misc_lock);
}
}
* nature are expected, we must enable TxOk.
*/
if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) {
- spin_lock_irqsave(&dev->misc_lock, flags);
+ spin_lock_irq(&dev->misc_lock);
dev->IMR_cache |= ISR_TXOK;
writel(dev->IMR_cache, dev->base + IMR);
- spin_unlock_irqrestore(&dev->misc_lock, flags);
+ spin_unlock_irq(&dev->misc_lock);
}
/* MIB interrupt: one of the statistics counters is about to overflow */
u32 tx_done_idx, *desc;
unsigned long flags;
- spin_lock_irqsave(&dev->tx_lock, flags);
+ local_irq_save(flags);
tx_done_idx = dev->tx_done_idx;
desc = dev->tx_descs + (tx_done_idx * DESC_SIZE);
ndev->name,
tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS]));
- spin_unlock_irqrestore(&dev->tx_lock, flags);
+ local_irq_restore(flags);
}
static void ns83820_tx_watch(unsigned long data)
{
struct ns83820 *dev = PRIV(ndev);
int timed_out = 0;
- unsigned long start;
+ long start;
u32 status;
int loops = 0;
break;
if (status & fail)
break;
- if (time_after_eq(jiffies, start + HZ)) {
+ if ((jiffies - start) >= HZ) {
timed_out = 1;
break;
}
int using_dac = 0;
/* See if we can set the dma mask early on; failure is fatal. */
- if (sizeof(dma_addr_t) == 8 &&
- !pci_set_dma_mask(pci_dev, DMA_64BIT_MASK)) {
+ if (sizeof(dma_addr_t) == 8 &&
+ !pci_set_dma_mask(pci_dev, 0xffffffffffffffffULL)) {
using_dac = 1;
- } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) {
+ } else if (!pci_set_dma_mask(pci_dev, 0xffffffff)) {
using_dac = 0;
} else {
- dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n");
+ printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n");
return -ENODEV;
}
err = pci_enable_device(pci_dev);
if (err) {
- dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err);
+ printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err);
goto out_free;
}
dev->IMR_cache = 0;
- err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED,
+ err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ,
DRV_NAME, ndev);
if (err) {
- dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n",
- pci_dev->irq, err);
+ printk(KERN_INFO "ns83820: unable to register irq %d\n",
+ pci_dev->irq);
goto out_disable;
}
rtnl_lock();
err = dev_alloc_name(ndev, ndev->name);
if (err < 0) {
- dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err);
+ printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err);
goto out_free_irq;
}
MODULE_AUTHOR("Benjamin LaHaise <bcrl@kvack.org>");
MODULE_DESCRIPTION("National Semiconductor DP83820 10/100/1000 driver");
MODULE_LICENSE("GPL");
-MODULE_VERSION(VERSION);
MODULE_DEVICE_TABLE(pci, ns83820_pci_tbl);