Commit 3b9fb4e8 authored by Jeff Garzik's avatar Jeff Garzik

Merge redhat.com:/garz/repo/linus-2.5

into redhat.com:/garz/repo/net-drivers-2.5
parents dc2f9764 26da9f9f
...@@ -671,7 +671,7 @@ static void arcnet_timeout(struct net_device *dev) ...@@ -671,7 +671,7 @@ static void arcnet_timeout(struct net_device *dev)
* interrupts. Establish which device needs attention, and call the correct * interrupts. Establish which device needs attention, and call the correct
* chipset interrupt handler. * chipset interrupt handler.
*/ */
void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs) irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
struct arcnet_local *lp; struct arcnet_local *lp;
...@@ -696,7 +696,7 @@ void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -696,7 +696,7 @@ void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
ACOMMAND(CFLAGScmd | RESETclear); ACOMMAND(CFLAGScmd | RESETclear);
AINTMASK(0); AINTMASK(0);
spin_unlock(&arcnet_lock); spin_unlock(&arcnet_lock);
return; return IRQ_HANDLED;
} }
BUGMSG(D_DURING, "in arcnet_inthandler (status=%Xh, intmask=%Xh)\n", BUGMSG(D_DURING, "in arcnet_inthandler (status=%Xh, intmask=%Xh)\n",
...@@ -864,6 +864,7 @@ void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -864,6 +864,7 @@ void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
AINTMASK(lp->intmask); AINTMASK(lp->intmask);
spin_unlock(&arcnet_lock); spin_unlock(&arcnet_lock);
return IRQ_RETVAL(didsomething);
} }
......
...@@ -60,7 +60,14 @@ ...@@ -60,7 +60,14 @@
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/mii.h> #include <linux/mii.h>
#define E100_REGS_LEN 1 #define E100_CABLE_UNKNOWN 0
#define E100_CABLE_OK 1
#define E100_CABLE_OPEN_NEAR 2 /* Open Circuit Near End */
#define E100_CABLE_OPEN_FAR 3 /* Open Circuit Far End */
#define E100_CABLE_SHORT_NEAR 4 /* Short Circuit Near End */
#define E100_CABLE_SHORT_FAR 5 /* Short Circuit Far End */
#define E100_REGS_LEN 2
/* /*
* Configure parameters for buffers per controller. * Configure parameters for buffers per controller.
* If the machine this is being used on is a faster machine (i.e. > 150MHz) * If the machine this is being used on is a faster machine (i.e. > 150MHz)
...@@ -105,8 +112,6 @@ ...@@ -105,8 +112,6 @@
#define E100_MAX_CU_IDLE_WAIT 50 /* Max udelays in wait_cus_idle */ #define E100_MAX_CU_IDLE_WAIT 50 /* Max udelays in wait_cus_idle */
/* HWI feature related constant */ /* HWI feature related constant */
#define HWI_MAX_LOOP 100
#define MAX_SAME_RESULTS 3
#define HWI_REGISTER_GRANULARITY 80 /* register granularity = 80 Cm */ #define HWI_REGISTER_GRANULARITY 80 /* register granularity = 80 Cm */
#define HWI_NEAR_END_BOUNDARY 1000 /* Near end is defined as < 10 meters */ #define HWI_NEAR_END_BOUNDARY 1000 /* Near end is defined as < 10 meters */
...@@ -942,7 +947,6 @@ struct e100_private { ...@@ -942,7 +947,6 @@ struct e100_private {
#ifdef CONFIG_PM #ifdef CONFIG_PM
u32 pci_state[16]; u32 pci_state[16];
#endif #endif
char ifname[IFNAMSIZ];
#ifdef E100_CU_DEBUG #ifdef E100_CU_DEBUG
u8 last_cmd; u8 last_cmd;
u8 last_sub_cmd; u8 last_sub_cmd;
...@@ -956,7 +960,10 @@ struct e100_private { ...@@ -956,7 +960,10 @@ struct e100_private {
#define E100_SPEED_100_FULL 4 #define E100_SPEED_100_FULL 4
/********* function prototypes *************/ /********* function prototypes *************/
extern int e100_open(struct net_device *);
extern int e100_close(struct net_device *);
extern void e100_isolate_driver(struct e100_private *bdp); extern void e100_isolate_driver(struct e100_private *bdp);
extern unsigned char e100_hw_init(struct e100_private *);
extern void e100_sw_reset(struct e100_private *bdp, u32 reset_cmd); extern void e100_sw_reset(struct e100_private *bdp, u32 reset_cmd);
extern u8 e100_start_cu(struct e100_private *bdp, tcb_t *tcb); extern u8 e100_start_cu(struct e100_private *bdp, tcb_t *tcb);
extern void e100_free_non_tx_cmd(struct e100_private *bdp, extern void e100_free_non_tx_cmd(struct e100_private *bdp,
...@@ -981,14 +988,13 @@ extern unsigned char e100_cu_unknown_state(struct e100_private *bdp); ...@@ -981,14 +988,13 @@ extern unsigned char e100_cu_unknown_state(struct e100_private *bdp);
#define TEST_TIMEOUT 0x08 #define TEST_TIMEOUT 0x08
enum test_offsets { enum test_offsets {
E100_EEPROM_TEST_FAIL = 0, test_link,
E100_CHIP_TIMEOUT, test_eeprom,
E100_ROM_TEST_FAIL, test_self_test,
E100_REG_TEST_FAIL, test_loopback_mac,
E100_MAC_TEST_FAIL, test_loopback_phy,
E100_LPBK_MAC_FAIL, cable_diag,
E100_LPBK_PHY_FAIL, max_test_res, /* must be last */
E100_MAX_TEST_RES
}; };
#endif #endif
This diff is collapsed.
...@@ -628,8 +628,6 @@ e100_force_speed_duplex(struct e100_private *bdp) ...@@ -628,8 +628,6 @@ e100_force_speed_duplex(struct e100_private *bdp)
u16 control; u16 control;
unsigned long expires; unsigned long expires;
e100_phy_reset(bdp);
bdp->flags |= DF_SPEED_FORCED; bdp->flags |= DF_SPEED_FORCED;
e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &control); e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &control);
...@@ -912,6 +910,10 @@ e100_phy_reset(struct e100_private *bdp) ...@@ -912,6 +910,10 @@ e100_phy_reset(struct e100_private *bdp)
u16 ctrl_reg; u16 ctrl_reg;
ctrl_reg = BMCR_RESET; ctrl_reg = BMCR_RESET;
e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg); e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, ctrl_reg);
/* ieee 802.3 : The reset process shall be completed */
/* within 0.5 seconds from the settting of PHY reset bit. */
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ / 2);
} }
unsigned char __devinit unsigned char __devinit
...@@ -928,6 +930,7 @@ e100_phy_init(struct e100_private *bdp) ...@@ -928,6 +930,7 @@ e100_phy_init(struct e100_private *bdp)
bdp->PhyDelay = 0; bdp->PhyDelay = 0;
bdp->zlock_state = ZLOCK_INITIAL; bdp->zlock_state = ZLOCK_INITIAL;
e100_phy_reset(bdp);
e100_phy_set_speed_duplex(bdp, false); e100_phy_set_speed_duplex(bdp, false);
e100_fix_polarity(bdp); e100_fix_polarity(bdp);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/ *******************************************************************************/
#include "e100.h" #include "e100_phy.h"
#include "e100_config.h" #include "e100_config.h"
extern u16 e100_eeprom_read(struct e100_private *, u16); extern u16 e100_eeprom_read(struct e100_private *, u16);
...@@ -46,6 +46,7 @@ static u8 e100_diag_loopback_alloc(struct e100_private *); ...@@ -46,6 +46,7 @@ static u8 e100_diag_loopback_alloc(struct e100_private *);
static void e100_diag_loopback_cu_ru_exec(struct e100_private *); static void e100_diag_loopback_cu_ru_exec(struct e100_private *);
static u8 e100_diag_check_pkt(u8 *); static u8 e100_diag_check_pkt(u8 *);
static void e100_diag_loopback_free(struct e100_private *); static void e100_diag_loopback_free(struct e100_private *);
static int e100_cable_diag(struct e100_private *bdp);
#define LB_PACKET_SIZE 1500 #define LB_PACKET_SIZE 1500
...@@ -60,46 +61,52 @@ u32 ...@@ -60,46 +61,52 @@ u32
e100_run_diag(struct net_device *dev, u64 *test_info, u32 flags) e100_run_diag(struct net_device *dev, u64 *test_info, u32 flags)
{ {
struct e100_private* bdp = dev->priv; struct e100_private* bdp = dev->priv;
u8 test_result = true; u8 test_result = 0;
e100_isolate_driver(bdp);
if (!e100_get_link_state(bdp)) {
test_result = ETH_TEST_FL_FAILED;
test_info[test_link] = true;
}
if (!e100_diag_eeprom(dev)) {
test_result = ETH_TEST_FL_FAILED;
test_info[test_eeprom] = true;
}
if (flags & ETH_TEST_FL_OFFLINE) { if (flags & ETH_TEST_FL_OFFLINE) {
u8 fail_mask; u8 fail_mask;
if (netif_running(dev)) {
fail_mask = e100_diag_selftest(dev); spin_lock_bh(&dev->xmit_lock);
if (fail_mask) { e100_close(dev);
test_result = false; spin_unlock_bh(&dev->xmit_lock);
if (fail_mask & REGISTER_TEST_FAIL) }
test_info [E100_REG_TEST_FAIL] = true; if (e100_diag_selftest(dev)) {
if (fail_mask & ROM_TEST_FAIL) test_result = ETH_TEST_FL_FAILED;
test_info [E100_ROM_TEST_FAIL] = true; test_info[test_self_test] = true;
if (fail_mask & SELF_TEST_FAIL)
test_info [E100_MAC_TEST_FAIL] = true;
if (fail_mask & TEST_TIMEOUT)
test_info [E100_CHIP_TIMEOUT] = true;
} }
fail_mask = e100_diag_loopback(dev); fail_mask = e100_diag_loopback(dev);
if (fail_mask) { if (fail_mask) {
test_result = false; test_result = ETH_TEST_FL_FAILED;
if (fail_mask & PHY_LOOPBACK) if (fail_mask & PHY_LOOPBACK)
test_info [E100_LPBK_PHY_FAIL] = true; test_info[test_loopback_phy] = true;
if (fail_mask & MAC_LOOPBACK) if (fail_mask & MAC_LOOPBACK)
test_info [E100_LPBK_MAC_FAIL] = true; test_info[test_loopback_mac] = true;
} }
}
if (!e100_diag_eeprom(dev)) { test_info[cable_diag] = e100_cable_diag(bdp);
test_result = false; /* Need hw init regardless of netif_running */
test_info [E100_EEPROM_TEST_FAIL] = true; e100_hw_init(bdp);
if (netif_running(dev)) {
e100_open(dev);
}
}
else {
test_info[test_self_test] = false;
test_info[test_loopback_phy] = false;
test_info[test_loopback_mac] = false;
test_info[cable_diag] = false;
} }
set_current_state(TASK_UNINTERRUPTIBLE); return flags | test_result;
schedule_timeout(HZ * 2);
e100_deisolate_driver(bdp, false);
return flags | (test_result ? 0 : ETH_TEST_FL_FAILED);
} }
/** /**
...@@ -126,8 +133,6 @@ e100_diag_selftest(struct net_device *dev) ...@@ -126,8 +133,6 @@ e100_diag_selftest(struct net_device *dev)
} }
} }
e100_configure_device(bdp);
return retval; return retval;
} }
...@@ -165,14 +170,14 @@ e100_diag_loopback (struct net_device *dev) ...@@ -165,14 +170,14 @@ e100_diag_loopback (struct net_device *dev)
u8 rc = 0; u8 rc = 0;
printk(KERN_DEBUG "%s: PHY loopback test starts\n", dev->name); printk(KERN_DEBUG "%s: PHY loopback test starts\n", dev->name);
e100_sw_reset(dev->priv, PORT_SELECTIVE_RESET); e100_hw_init(dev->priv);
if (!e100_diag_one_loopback(dev, PHY_LOOPBACK)) { if (!e100_diag_one_loopback(dev, PHY_LOOPBACK)) {
rc |= PHY_LOOPBACK; rc |= PHY_LOOPBACK;
} }
printk(KERN_DEBUG "%s: PHY loopback test ends\n", dev->name); printk(KERN_DEBUG "%s: PHY loopback test ends\n", dev->name);
printk(KERN_DEBUG "%s: MAC loopback test starts\n", dev->name); printk(KERN_DEBUG "%s: MAC loopback test starts\n", dev->name);
e100_sw_reset(dev->priv, PORT_SELECTIVE_RESET); e100_hw_init(dev->priv);
if (!e100_diag_one_loopback(dev, MAC_LOOPBACK)) { if (!e100_diag_one_loopback(dev, MAC_LOOPBACK)) {
rc |= MAC_LOOPBACK; rc |= MAC_LOOPBACK;
} }
...@@ -257,15 +262,10 @@ e100_diag_config_loopback(struct e100_private* bdp, ...@@ -257,15 +262,10 @@ e100_diag_config_loopback(struct e100_private* bdp,
if (set_loopback) if (set_loopback)
/* Set PHY loopback mode */ /* Set PHY loopback mode */
e100_phy_set_loopback(bdp); e100_phy_set_loopback(bdp);
else { /* Back to normal speed and duplex */ else
if (bdp->params.e100_speed_duplex == E100_AUTONEG) /* Reset PHY loopback mode */
/* Reset PHY and do autoneg */ e100_phy_reset(bdp);
e100_phy_autoneg(bdp); /* Wait for PHY state change */
else
/* Reset PHY and force speed and duplex */
e100_force_speed_duplex(bdp);
}
/* Wait for PHY state change */
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ); schedule_timeout(HZ);
} else { /* For MAC loopback wait 500 msec to take effect */ } else { /* For MAC loopback wait 500 msec to take effect */
...@@ -348,10 +348,6 @@ static void ...@@ -348,10 +348,6 @@ static void
e100_diag_loopback_cu_ru_exec(struct e100_private *bdp) e100_diag_loopback_cu_ru_exec(struct e100_private *bdp)
{ {
/*load CU & RU base */ /*load CU & RU base */
if (!e100_wait_exec_cmplx(bdp, 0, SCB_CUC_LOAD_BASE, 0))
printk(KERN_ERR "e100: SCB_CUC_LOAD_BASE failed\n");
if(!e100_wait_exec_cmplx(bdp, 0, SCB_RUC_LOAD_BASE, 0))
printk(KERN_ERR "e100: SCB_RUC_LOAD_BASE failed!\n");
if(!e100_wait_exec_cmplx(bdp, bdp->loopback.dma_handle, SCB_RUC_START, 0)) if(!e100_wait_exec_cmplx(bdp, bdp->loopback.dma_handle, SCB_RUC_START, 0))
printk(KERN_ERR "e100: SCB_RUC_START failed!\n"); printk(KERN_ERR "e100: SCB_RUC_START failed!\n");
...@@ -433,3 +429,72 @@ e100_diag_loopback_free (struct e100_private *bdp) ...@@ -433,3 +429,72 @@ e100_diag_loopback_free (struct e100_private *bdp)
bdp->loopback.dma_handle); bdp->loopback.dma_handle);
} }
static int
e100_cable_diag(struct e100_private *bdp)
{
int saved_open_circut = 0xffff;
int saved_short_circut = 0xffff;
int saved_distance = 0xffff;
int saved_same = 0;
int cable_status = E100_CABLE_UNKNOWN;
int i;
/* If we have link, */
if (e100_get_link_state(bdp))
return E100_CABLE_OK;
if (bdp->rev_id < D102_REV_ID)
return E100_CABLE_UNKNOWN;
/* Disable MDI/MDI-X auto switching */
e100_mdi_write(bdp, MII_NCONFIG, bdp->phy_addr,
MDI_MDIX_RESET_ALL_MASK);
/* Set to 100 Full as required by cable test */
e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr,
BMCR_SPEED100 | BMCR_FULLDPLX);
/* Test up to 100 times */
for (i = 0; i < 100; i++) {
u16 ctrl_reg;
int distance, open_circut, short_circut, near_end;
/* Enable and execute cable test */
e100_mdi_write(bdp, HWI_CONTROL_REG, bdp->phy_addr,
(HWI_TEST_ENABLE | HWI_TEST_EXECUTE));
/* Wait for cable test finished */
set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ/100 + 1);
/* Read results */
e100_mdi_read(bdp, HWI_CONTROL_REG, bdp->phy_addr, &ctrl_reg);
distance = ctrl_reg & HWI_TEST_DISTANCE;
open_circut = ctrl_reg & HWI_TEST_HIGHZ_PROBLEM;
short_circut = ctrl_reg & HWI_TEST_LOWZ_PROBLEM;
if ((distance == saved_distance) &&
(open_circut == saved_open_circut) &&
(short_circut == saved_short_circut))
saved_same++;
else {
saved_same = 0;
saved_distance = distance;
saved_open_circut = open_circut;
saved_short_circut = short_circut;
}
/* If results are the same 3 times */
if (saved_same == 3) {
near_end = ((distance * HWI_REGISTER_GRANULARITY) <
HWI_NEAR_END_BOUNDARY);
if (open_circut)
cable_status = (near_end) ?
E100_CABLE_OPEN_NEAR : E100_CABLE_OPEN_FAR;
if (short_circut)
cable_status = (near_end) ?
E100_CABLE_SHORT_NEAR : E100_CABLE_SHORT_FAR;
break;
}
}
/* Reset cable test */
e100_mdi_write(bdp, HWI_CONTROL_REG, bdp->phy_addr, HWI_RESET_ALL_MASK);
return cable_status;
}
################################################################################ ################################################################################
# #
# #
# Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. # Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
# #
# This program is free software; you can redistribute it and/or modify it # This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free # under the terms of the GNU General Public License as published by the Free
......
...@@ -134,6 +134,7 @@ struct e1000_buffer { ...@@ -134,6 +134,7 @@ struct e1000_buffer {
uint64_t dma; uint64_t dma;
unsigned long length; unsigned long length;
unsigned long time_stamp; unsigned long time_stamp;
unsigned int next_to_watch;
}; };
struct e1000_desc_ring { struct e1000_desc_ring {
...@@ -169,7 +170,6 @@ struct e1000_adapter { ...@@ -169,7 +170,6 @@ struct e1000_adapter {
struct timer_list watchdog_timer; struct timer_list watchdog_timer;
struct timer_list phy_info_timer; struct timer_list phy_info_timer;
struct vlan_group *vlgrp; struct vlan_group *vlgrp;
char *id_string;
uint32_t bd_number; uint32_t bd_number;
uint32_t rx_buffer_len; uint32_t rx_buffer_len;
uint32_t part_num; uint32_t part_num;
...@@ -218,6 +218,9 @@ struct e1000_adapter { ...@@ -218,6 +218,9 @@ struct e1000_adapter {
struct e1000_phy_info phy_info; struct e1000_phy_info phy_info;
struct e1000_phy_stats phy_stats; struct e1000_phy_stats phy_stats;
uint32_t test_icr;
struct e1000_desc_ring test_tx_ring;
struct e1000_desc_ring test_rx_ring;
uint32_t pci_state[16]; uint32_t pci_state[16];
......
This diff is collapsed.
...@@ -185,6 +185,7 @@ e1000_set_mac_type(struct e1000_hw *hw) ...@@ -185,6 +185,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
break; break;
case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_COPPER:
case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_FIBER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
hw->mac_type = e1000_82546; hw->mac_type = e1000_82546;
break; break;
case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI:
...@@ -288,9 +289,7 @@ e1000_reset_hw(struct e1000_hw *hw) ...@@ -288,9 +289,7 @@ e1000_reset_hw(struct e1000_hw *hw)
/* Configure activity LED after PHY reset */ /* Configure activity LED after PHY reset */
led_ctrl = E1000_READ_REG(hw, LEDCTL); led_ctrl = E1000_READ_REG(hw, LEDCTL);
led_ctrl &= IGP_ACTIVITY_LED_MASK; led_ctrl &= IGP_ACTIVITY_LED_MASK;
led_ctrl |= IGP_ACTIVITY_LED_ENABLE; led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
if(hw->mac_type == e1000_82547)
led_ctrl |= IGP_LED3_MODE;
E1000_WRITE_REG(hw, LEDCTL, led_ctrl); E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
} }
...@@ -737,9 +736,7 @@ e1000_setup_copper_link(struct e1000_hw *hw) ...@@ -737,9 +736,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
/* Configure activity LED after PHY reset */ /* Configure activity LED after PHY reset */
led_ctrl = E1000_READ_REG(hw, LEDCTL); led_ctrl = E1000_READ_REG(hw, LEDCTL);
led_ctrl &= IGP_ACTIVITY_LED_MASK; led_ctrl &= IGP_ACTIVITY_LED_MASK;
led_ctrl |= IGP_ACTIVITY_LED_ENABLE; led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
if(hw->mac_type == e1000_82547)
led_ctrl |= IGP_LED3_MODE;
E1000_WRITE_REG(hw, LEDCTL, led_ctrl); E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
if(hw->autoneg_advertised == ADVERTISE_1000_FULL) { if(hw->autoneg_advertised == ADVERTISE_1000_FULL) {
...@@ -2293,9 +2290,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw) ...@@ -2293,9 +2290,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
/* Configure activity LED after PHY reset */ /* Configure activity LED after PHY reset */
led_ctrl = E1000_READ_REG(hw, LEDCTL); led_ctrl = E1000_READ_REG(hw, LEDCTL);
led_ctrl &= IGP_ACTIVITY_LED_MASK; led_ctrl &= IGP_ACTIVITY_LED_MASK;
led_ctrl |= IGP_ACTIVITY_LED_ENABLE; led_ctrl |= (IGP_ACTIVITY_LED_ENABLE | IGP_LED3_MODE);
if(hw->mac_type == e1000_82547)
led_ctrl |= IGP_LED3_MODE;
E1000_WRITE_REG(hw, LEDCTL, led_ctrl); E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
} }
} }
...@@ -3801,6 +3796,7 @@ e1000_setup_led(struct e1000_hw *hw) ...@@ -3801,6 +3796,7 @@ e1000_setup_led(struct e1000_hw *hw)
case E1000_DEV_ID_82540EM_LOM: case E1000_DEV_ID_82540EM_LOM:
case E1000_DEV_ID_82545EM_COPPER: case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_COPPER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI:
case E1000_DEV_ID_82541EP: case E1000_DEV_ID_82541EP:
case E1000_DEV_ID_82547EI: case E1000_DEV_ID_82547EI:
...@@ -3842,6 +3838,7 @@ e1000_cleanup_led(struct e1000_hw *hw) ...@@ -3842,6 +3838,7 @@ e1000_cleanup_led(struct e1000_hw *hw)
case E1000_DEV_ID_82545EM_FIBER: case E1000_DEV_ID_82545EM_FIBER:
case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_COPPER:
case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_FIBER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI:
case E1000_DEV_ID_82541EP: case E1000_DEV_ID_82541EP:
case E1000_DEV_ID_82547EI: case E1000_DEV_ID_82547EI:
...@@ -3896,6 +3893,7 @@ e1000_led_on(struct e1000_hw *hw) ...@@ -3896,6 +3893,7 @@ e1000_led_on(struct e1000_hw *hw)
case E1000_DEV_ID_82540EM_LOM: case E1000_DEV_ID_82540EM_LOM:
case E1000_DEV_ID_82545EM_COPPER: case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_COPPER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI:
case E1000_DEV_ID_82541EP: case E1000_DEV_ID_82541EP:
case E1000_DEV_ID_82547EI: case E1000_DEV_ID_82547EI:
...@@ -3949,6 +3947,7 @@ e1000_led_off(struct e1000_hw *hw) ...@@ -3949,6 +3947,7 @@ e1000_led_off(struct e1000_hw *hw)
case E1000_DEV_ID_82540EM_LOM: case E1000_DEV_ID_82540EM_LOM:
case E1000_DEV_ID_82545EM_COPPER: case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82546EB_COPPER: case E1000_DEV_ID_82546EB_COPPER:
case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82541EI: case E1000_DEV_ID_82541EI:
case E1000_DEV_ID_82541EP: case E1000_DEV_ID_82541EP:
case E1000_DEV_ID_82547EI: case E1000_DEV_ID_82547EI:
...@@ -4206,7 +4205,11 @@ e1000_get_bus_info(struct e1000_hw *hw) ...@@ -4206,7 +4205,11 @@ e1000_get_bus_info(struct e1000_hw *hw)
status = E1000_READ_REG(hw, STATUS); status = E1000_READ_REG(hw, STATUS);
hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ? hw->bus_type = (status & E1000_STATUS_PCIX_MODE) ?
e1000_bus_type_pcix : e1000_bus_type_pci; e1000_bus_type_pcix : e1000_bus_type_pci;
if(hw->bus_type == e1000_bus_type_pci) {
if(hw->device_id == E1000_DEV_ID_82546EB_QUAD_COPPER) {
hw->bus_speed = (hw->bus_type == e1000_bus_type_pci) ?
e1000_bus_speed_66 : e1000_bus_speed_120;
} else if(hw->bus_type == e1000_bus_type_pci) {
hw->bus_speed = (status & E1000_STATUS_PCI66) ? hw->bus_speed = (status & E1000_STATUS_PCI66) ?
e1000_bus_speed_66 : e1000_bus_speed_33; e1000_bus_speed_66 : e1000_bus_speed_33;
} else { } else {
......
...@@ -99,6 +99,7 @@ typedef enum { ...@@ -99,6 +99,7 @@ typedef enum {
e1000_bus_speed_33, e1000_bus_speed_33,
e1000_bus_speed_66, e1000_bus_speed_66,
e1000_bus_speed_100, e1000_bus_speed_100,
e1000_bus_speed_120,
e1000_bus_speed_133, e1000_bus_speed_133,
e1000_bus_speed_reserved e1000_bus_speed_reserved
} e1000_bus_speed; } e1000_bus_speed;
...@@ -314,10 +315,11 @@ void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value); ...@@ -314,10 +315,11 @@ void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset, uint32_t value);
#define E1000_DEV_ID_82545EM_FIBER 0x1011 #define E1000_DEV_ID_82545EM_FIBER 0x1011
#define E1000_DEV_ID_82546EB_COPPER 0x1010 #define E1000_DEV_ID_82546EB_COPPER 0x1010
#define E1000_DEV_ID_82546EB_FIBER 0x1012 #define E1000_DEV_ID_82546EB_FIBER 0x1012
#define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D
#define E1000_DEV_ID_82541EI 0x1013 #define E1000_DEV_ID_82541EI 0x1013
#define E1000_DEV_ID_82541EP 0x1018 #define E1000_DEV_ID_82541EP 0x1018
#define E1000_DEV_ID_82547EI 0x1019 #define E1000_DEV_ID_82547EI 0x1019
#define NUM_DEV_IDS 19 #define NUM_DEV_IDS 20
#define NODE_ADDRESS_SIZE 6 #define NODE_ADDRESS_SIZE 6
#define ETH_LENGTH_OF_ADDRESS 6 #define ETH_LENGTH_OF_ADDRESS 6
...@@ -601,7 +603,7 @@ struct e1000_ffvt_entry { ...@@ -601,7 +603,7 @@ struct e1000_ffvt_entry {
#define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */ #define E1000_EECD 0x00010 /* EEPROM/Flash Control - RW */
#define E1000_EERD 0x00014 /* EEPROM Read - RW */ #define E1000_EERD 0x00014 /* EEPROM Read - RW */
#define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ #define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */
#define E1000_FLA 0x0001C /* Flash Access Register - RW */ #define E1000_FLA 0x0001C /* Flash Access - RW */
#define E1000_MDIC 0x00020 /* MDI Control - RW */ #define E1000_MDIC 0x00020 /* MDI Control - RW */
#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */
#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */
...@@ -730,6 +732,7 @@ struct e1000_ffvt_entry { ...@@ -730,6 +732,7 @@ struct e1000_ffvt_entry {
* the registers function in the same manner. * the registers function in the same manner.
*/ */
#define E1000_82542_CTRL E1000_CTRL #define E1000_82542_CTRL E1000_CTRL
#define E1000_82542_CTRL_DUP E1000_CTRL_DUP
#define E1000_82542_STATUS E1000_STATUS #define E1000_82542_STATUS E1000_STATUS
#define E1000_82542_EECD E1000_EECD #define E1000_82542_EECD E1000_EECD
#define E1000_82542_EERD E1000_EERD #define E1000_82542_EERD E1000_EERD
...@@ -1485,7 +1488,6 @@ struct e1000_hw { ...@@ -1485,7 +1488,6 @@ struct e1000_hw {
#define E1000_COLLISION_DISTANCE 64 #define E1000_COLLISION_DISTANCE 64
#define E1000_FDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE #define E1000_FDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
#define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE #define E1000_HDX_COLLISION_DISTANCE E1000_COLLISION_DISTANCE
#define E1000_GB_HDX_COLLISION_DISTANCE 512
#define E1000_COLD_SHIFT 12 #define E1000_COLD_SHIFT 12
/* The number of Transmit and Receive Descriptors must be a multiple of 8 */ /* The number of Transmit and Receive Descriptors must be a multiple of 8 */
......
This diff is collapsed.
...@@ -134,7 +134,7 @@ clone_list[] __initdata = { ...@@ -134,7 +134,7 @@ clone_list[] __initdata = {
{0,} {0,}
}; };
static void tachyon_interrupt(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t tachyon_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void tachyon_interrupt_handler(int irq, void* dev_id, struct pt_regs* regs); static void tachyon_interrupt_handler(int irq, void* dev_id, struct pt_regs* regs);
static int initialize_register_pointers(struct fc_info *fi); static int initialize_register_pointers(struct fc_info *fi);
...@@ -623,7 +623,7 @@ u_int bus_addr, bus_indx_addr, i; ...@@ -623,7 +623,7 @@ u_int bus_addr, bus_indx_addr, i;
} }
static void tachyon_interrupt(int irq, void* dev_id, struct pt_regs* regs) static irqreturn_t tachyon_interrupt(int irq, void* dev_id, struct pt_regs* regs)
{ {
struct Scsi_Host *host = dev_id; struct Scsi_Host *host = dev_id;
struct iph5526_hostdata *hostdata = (struct iph5526_hostdata *)host->hostdata; struct iph5526_hostdata *hostdata = (struct iph5526_hostdata *)host->hostdata;
...@@ -632,6 +632,7 @@ u_long flags; ...@@ -632,6 +632,7 @@ u_long flags;
spin_lock_irqsave(&fi->fc_lock, flags); spin_lock_irqsave(&fi->fc_lock, flags);
tachyon_interrupt_handler(irq, dev_id, regs); tachyon_interrupt_handler(irq, dev_id, regs);
spin_unlock_irqrestore(&fi->fc_lock, flags); spin_unlock_irqrestore(&fi->fc_lock, flags);
return IRQ_HANDLED;
} }
static void tachyon_interrupt_handler(int irq, void* dev_id, struct pt_regs* regs) static void tachyon_interrupt_handler(int irq, void* dev_id, struct pt_regs* regs)
...@@ -3720,12 +3721,13 @@ struct fc_info *fi = (struct fc_info*)dev->priv; ...@@ -3720,12 +3721,13 @@ struct fc_info *fi = (struct fc_info*)dev->priv;
int iph5526_detect(Scsi_Host_Template *tmpt) int iph5526_detect(Scsi_Host_Template *tmpt)
{ {
struct Scsi_Host *host = NULL; struct Scsi_Host *host = NULL;
struct iph5526_hostdata *hostdata; struct iph5526_hostdata *hostdata;
struct fc_info *fi = NULL; struct fc_info *fi = NULL;
int no_of_hosts = 0, timeout, i, j, count = 0; int no_of_hosts = 0, i, j, count = 0;
u_int pci_maddr = 0; u_int pci_maddr = 0;
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
unsigned long timeout;
tmpt->proc_name = "iph5526"; tmpt->proc_name = "iph5526";
if (pci_present() == 0) { if (pci_present() == 0) {
......
...@@ -188,7 +188,7 @@ struct fec_enet_private { ...@@ -188,7 +188,7 @@ struct fec_enet_private {
static int fec_enet_open(struct net_device *dev); static int fec_enet_open(struct net_device *dev);
static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev); static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
static void fec_enet_mii(struct net_device *dev); static void fec_enet_mii(struct net_device *dev);
static void fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs); static irqreturn_t fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);
static void fec_enet_tx(struct net_device *dev); static void fec_enet_tx(struct net_device *dev);
static void fec_enet_rx(struct net_device *dev); static void fec_enet_rx(struct net_device *dev);
static int fec_enet_close(struct net_device *dev); static int fec_enet_close(struct net_device *dev);
...@@ -393,12 +393,13 @@ fec_timeout(struct net_device *dev) ...@@ -393,12 +393,13 @@ fec_timeout(struct net_device *dev)
/* The interrupt handler. /* The interrupt handler.
* This is called from the MPC core interrupt. * This is called from the MPC core interrupt.
*/ */
static void static irqreturn_t
fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs) fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
volatile fec_t *fecp; volatile fec_t *fecp;
uint int_events; uint int_events;
int handled = 0;
fecp = (volatile fec_t*)dev->base_addr; fecp = (volatile fec_t*)dev->base_addr;
...@@ -413,20 +414,27 @@ fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs) ...@@ -413,20 +414,27 @@ fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
/* Handle receive event in its own function. /* Handle receive event in its own function.
*/ */
if (int_events & FEC_ENET_RXF) if (int_events & FEC_ENET_RXF) {
handled = 1;
fec_enet_rx(dev); fec_enet_rx(dev);
}
/* Transmit OK, or non-fatal error. Update the buffer /* Transmit OK, or non-fatal error. Update the buffer
descriptors. FEC handles all errors, we just discover descriptors. FEC handles all errors, we just discover
them as part of the transmit process. them as part of the transmit process.
*/ */
if (int_events & FEC_ENET_TXF) if (int_events & FEC_ENET_TXF) {
handled = 1;
fec_enet_tx(dev); fec_enet_tx(dev);
}
if (int_events & FEC_ENET_MII) if (int_events & FEC_ENET_MII) {
handled = 1;
fec_enet_mii(dev); fec_enet_mii(dev);
}
} }
return IRQ_RETVAL(handled);
} }
......
...@@ -114,7 +114,7 @@ extern int fmv18x_probe(struct net_device *dev); ...@@ -114,7 +114,7 @@ extern int fmv18x_probe(struct net_device *dev);
static int fmv18x_probe1(struct net_device *dev, short ioaddr); static int fmv18x_probe1(struct net_device *dev, short ioaddr);
static int net_open(struct net_device *dev); static int net_open(struct net_device *dev);
static int net_send_packet(struct sk_buff *skb, struct net_device *dev); static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void net_rx(struct net_device *dev); static void net_rx(struct net_device *dev);
static void net_timeout(struct net_device *dev); static void net_timeout(struct net_device *dev);
static int net_close(struct net_device *dev); static int net_close(struct net_device *dev);
...@@ -423,7 +423,7 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev) ...@@ -423,7 +423,7 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
/* The typical workload of the driver: /* The typical workload of the driver:
Handle the network interface interrupts. */ Handle the network interface interrupts. */
static void static irqreturn_t
net_interrupt(int irq, void *dev_id, struct pt_regs *regs) net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
...@@ -476,7 +476,7 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -476,7 +476,7 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
spin_unlock(&lp->lock); spin_unlock(&lp->lock);
} }
} }
return; return IRQ_RETVAL(status);
} }
/* We have a good packet(s), get it/them out of the buffers. */ /* We have a good packet(s), get it/them out of the buffers. */
......
...@@ -199,7 +199,7 @@ static void z8530_init(void); ...@@ -199,7 +199,7 @@ static void z8530_init(void);
static void init_channel(struct scc_channel *scc); static void init_channel(struct scc_channel *scc);
static void scc_key_trx (struct scc_channel *scc, char tx); static void scc_key_trx (struct scc_channel *scc, char tx);
static void scc_isr(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t scc_isr(int irq, void *dev_id, struct pt_regs *regs);
static void scc_init_timer(struct scc_channel *scc); static void scc_init_timer(struct scc_channel *scc);
static int scc_net_setup(struct scc_channel *scc, unsigned char *name, int addev); static int scc_net_setup(struct scc_channel *scc, unsigned char *name, int addev);
...@@ -625,7 +625,7 @@ static void scc_isr_dispatch(struct scc_channel *scc, int vector) ...@@ -625,7 +625,7 @@ static void scc_isr_dispatch(struct scc_channel *scc, int vector)
#define SCC_IRQTIMEOUT 30000 #define SCC_IRQTIMEOUT 30000
static void scc_isr(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t scc_isr(int irq, void *dev_id, struct pt_regs *regs)
{ {
unsigned char vector; unsigned char vector;
struct scc_channel *scc; struct scc_channel *scc;
...@@ -653,7 +653,7 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs) ...@@ -653,7 +653,7 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
if (k == SCC_IRQTIMEOUT) if (k == SCC_IRQTIMEOUT)
printk(KERN_WARNING "z8530drv: endless loop in scc_isr()?\n"); printk(KERN_WARNING "z8530drv: endless loop in scc_isr()?\n");
return; return IRQ_HANDLED;
} }
/* Find the SCC generating the interrupt by polling all attached SCCs /* Find the SCC generating the interrupt by polling all attached SCCs
...@@ -701,6 +701,7 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs) ...@@ -701,6 +701,7 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
} else } else
ctrl++; ctrl++;
} }
return IRQ_HANDLED;
} }
......
...@@ -541,6 +541,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -541,6 +541,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
struct myri_channel *chan = &mp->shmem->channel; struct myri_channel *chan = &mp->shmem->channel;
unsigned long flags; unsigned long flags;
u32 status; u32 status;
int handled = 0;
spin_lock_irqsave(&mp->irq_lock, flags); spin_lock_irqsave(&mp->irq_lock, flags);
...@@ -549,6 +550,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -549,6 +550,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (status & ISTAT_HOST) { if (status & ISTAT_HOST) {
u32 softstate; u32 softstate;
handled = 1;
DIRQ(("IRQ_DISAB ")); DIRQ(("IRQ_DISAB "));
myri_disable_irq(lregs, mp->cregs); myri_disable_irq(lregs, mp->cregs);
softstate = sbus_readl(&chan->state); softstate = sbus_readl(&chan->state);
...@@ -568,7 +570,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -568,7 +570,7 @@ static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
spin_unlock_irqrestore(&mp->irq_lock, flags); spin_unlock_irqrestore(&mp->irq_lock, flags);
return IRQ_HANDLED; return IRQ_RETVAL(handled);
} }
static int myri_open(struct net_device *dev) static int myri_open(struct net_device *dev)
......
...@@ -84,7 +84,7 @@ static int seeq8005_probe1(struct net_device *dev, int ioaddr); ...@@ -84,7 +84,7 @@ static int seeq8005_probe1(struct net_device *dev, int ioaddr);
static int seeq8005_open(struct net_device *dev); static int seeq8005_open(struct net_device *dev);
static void seeq8005_timeout(struct net_device *dev); static void seeq8005_timeout(struct net_device *dev);
static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev); static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev);
static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t seeq8005_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void seeq8005_rx(struct net_device *dev); static void seeq8005_rx(struct net_device *dev);
static int seeq8005_close(struct net_device *dev); static int seeq8005_close(struct net_device *dev);
static struct net_device_stats *seeq8005_get_stats(struct net_device *dev); static struct net_device_stats *seeq8005_get_stats(struct net_device *dev);
...@@ -400,11 +400,12 @@ static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev) ...@@ -400,11 +400,12 @@ static int seeq8005_send_packet(struct sk_buff *skb, struct net_device *dev)
/* The typical workload of the driver: /* The typical workload of the driver:
Handle the network interface interrupts. */ Handle the network interface interrupts. */
static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs) static irqreturn_t seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
struct net_local *lp; struct net_local *lp;
int ioaddr, status, boguscount = 0; int ioaddr, status, boguscount = 0;
int handled = 0;
ioaddr = dev->base_addr; ioaddr = dev->base_addr;
lp = (struct net_local *)dev->priv; lp = (struct net_local *)dev->priv;
...@@ -416,17 +417,20 @@ static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs) ...@@ -416,17 +417,20 @@ static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs)
} }
if (status & SEEQSTAT_WINDOW_INT) { if (status & SEEQSTAT_WINDOW_INT) {
handled = 1;
outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); outw( SEEQCMD_WINDOW_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
if (net_debug) { if (net_debug) {
printk("%s: window int!\n",dev->name); printk("%s: window int!\n",dev->name);
} }
} }
if (status & SEEQSTAT_TX_INT) { if (status & SEEQSTAT_TX_INT) {
handled = 1;
outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD); outw( SEEQCMD_TX_INT_ACK | (status & SEEQCMD_INT_MASK), SEEQ_CMD);
lp->stats.tx_packets++; lp->stats.tx_packets++;
netif_wake_queue(dev); /* Inform upper layers. */ netif_wake_queue(dev); /* Inform upper layers. */
} }
if (status & SEEQSTAT_RX_INT) { if (status & SEEQSTAT_RX_INT) {
handled = 1;
/* Got a packet(s). */ /* Got a packet(s). */
seeq8005_rx(dev); seeq8005_rx(dev);
} }
...@@ -436,6 +440,7 @@ static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs) ...@@ -436,6 +440,7 @@ static void seeq8005_interrupt(int irq, void *dev_id, struct pt_regs * regs)
if(net_debug>2) { if(net_debug>2) {
printk("%s: eoi\n",dev->name); printk("%s: eoi\n",dev->name);
} }
return IRQ_RETVAL(handled);
} }
/* We have a good packet(s), get it/them out of the buffers. */ /* We have a good packet(s), get it/them out of the buffers. */
......
...@@ -124,6 +124,7 @@ static void qe_init_rings(struct sunqe *qep) ...@@ -124,6 +124,7 @@ static void qe_init_rings(struct sunqe *qep)
qb->qe_rxd[i].rx_flags = qb->qe_rxd[i].rx_flags =
(RXD_OWN | ((RXD_PKT_SZ) & RXD_LENGTH)); (RXD_OWN | ((RXD_PKT_SZ) & RXD_LENGTH));
} }
return IRQ_HANDLED;
} }
static int qe_init(struct sunqe *qep, int from_irq) static int qe_init(struct sunqe *qep, int from_irq)
......
...@@ -201,7 +201,7 @@ static int streamer_open(struct net_device *dev); ...@@ -201,7 +201,7 @@ static int streamer_open(struct net_device *dev);
static int streamer_xmit(struct sk_buff *skb, struct net_device *dev); static int streamer_xmit(struct sk_buff *skb, struct net_device *dev);
static int streamer_close(struct net_device *dev); static int streamer_close(struct net_device *dev);
static void streamer_set_rx_mode(struct net_device *dev); static void streamer_set_rx_mode(struct net_device *dev);
static void streamer_interrupt(int irq, void *dev_id, static irqreturn_t streamer_interrupt(int irq, void *dev_id,
struct pt_regs *regs); struct pt_regs *regs);
static struct net_device_stats *streamer_get_stats(struct net_device *dev); static struct net_device_stats *streamer_get_stats(struct net_device *dev);
static int streamer_set_mac_address(struct net_device *dev, void *addr); static int streamer_set_mac_address(struct net_device *dev, void *addr);
...@@ -1021,7 +1021,7 @@ static void streamer_rx(struct net_device *dev) ...@@ -1021,7 +1021,7 @@ static void streamer_rx(struct net_device *dev)
} /* end for all completed rx descriptors */ } /* end for all completed rx descriptors */
} }
static void streamer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t streamer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct net_device *dev = (struct net_device *) dev_id; struct net_device *dev = (struct net_device *) dev_id;
struct streamer_private *streamer_priv = struct streamer_private *streamer_priv =
...@@ -1142,6 +1142,7 @@ static void streamer_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -1142,6 +1142,7 @@ static void streamer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} /* while() */ } /* while() */
spin_unlock(&streamer_priv->streamer_lock) ; spin_unlock(&streamer_priv->streamer_lock) ;
return IRQ_HANDLED;
} }
static int streamer_xmit(struct sk_buff *skb, struct net_device *dev) static int streamer_xmit(struct sk_buff *skb, struct net_device *dev)
......
...@@ -2027,7 +2027,7 @@ set_multicast_list(struct net_device *dev) ...@@ -2027,7 +2027,7 @@ set_multicast_list(struct net_device *dev)
} }
} }
return; return IRQ_HANDLED;
} }
/* /*
......
...@@ -117,7 +117,7 @@ static int lmc_rx (struct net_device *dev); ...@@ -117,7 +117,7 @@ static int lmc_rx (struct net_device *dev);
static int lmc_open(struct net_device *dev); static int lmc_open(struct net_device *dev);
static int lmc_close(struct net_device *dev); static int lmc_close(struct net_device *dev);
static struct net_device_stats *lmc_get_stats(struct net_device *dev); static struct net_device_stats *lmc_get_stats(struct net_device *dev);
static void lmc_interrupt(int irq, void *dev_instance, struct pt_regs *regs); static irqreturn_t lmc_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
static int lmc_set_config(struct net_device *dev, struct ifmap *map); static int lmc_set_config(struct net_device *dev, struct ifmap *map);
static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, size_t csr_size); static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, size_t csr_size);
static void lmc_softreset(lmc_softc_t * const); static void lmc_softreset(lmc_softc_t * const);
...@@ -1388,7 +1388,7 @@ static int lmc_ifdown (struct net_device *dev) /*fold00*/ ...@@ -1388,7 +1388,7 @@ static int lmc_ifdown (struct net_device *dev) /*fold00*/
/* Interrupt handling routine. This will take an incoming packet, or clean /* Interrupt handling routine. This will take an incoming packet, or clean
* up after a trasmit. * up after a trasmit.
*/ */
static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*fold00*/ static irqreturn_t lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*fold00*/
{ {
struct net_device *dev = (struct net_device *) dev_instance; struct net_device *dev = (struct net_device *) dev_instance;
lmc_softc_t *sc; lmc_softc_t *sc;
...@@ -1398,6 +1398,7 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /* ...@@ -1398,6 +1398,7 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*
unsigned int badtx; unsigned int badtx;
u32 firstcsr; u32 firstcsr;
int max_work = LMC_RXDESCS; int max_work = LMC_RXDESCS;
int handled = 0;
lmc_trace(dev, "lmc_interrupt in"); lmc_trace(dev, "lmc_interrupt in");
...@@ -1421,6 +1422,8 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /* ...@@ -1421,6 +1422,8 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*
/* always go through this loop at least once */ /* always go through this loop at least once */
while (csr & sc->lmc_intrmask) { while (csr & sc->lmc_intrmask) {
handled = 1;
/* /*
* Clear interrupt bits, we handle all case below * Clear interrupt bits, we handle all case below
*/ */
...@@ -1580,6 +1583,7 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /* ...@@ -1580,6 +1583,7 @@ static void lmc_interrupt (int irq, void *dev_instance, struct pt_regs *regs) /*
spin_unlock(&sc->lmc_lock); spin_unlock(&sc->lmc_lock);
lmc_trace(dev, "lmc_interrupt out"); lmc_trace(dev, "lmc_interrupt out");
return IRQ_RETVAL(handled);
} }
static int lmc_start_xmit (struct sk_buff *skb, struct net_device *dev) /*fold00*/ static int lmc_start_xmit (struct sk_buff *skb, struct net_device *dev) /*fold00*/
......
...@@ -329,7 +329,7 @@ void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc); ...@@ -329,7 +329,7 @@ void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc);
#endif #endif
void arcnet_unregister_proto(struct ArcProto *proto); void arcnet_unregister_proto(struct ArcProto *proto);
void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs); irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs);
void arcdev_setup(struct net_device *dev); void arcdev_setup(struct net_device *dev);
void arcnet_rx(struct net_device *dev, int bufnum); void arcnet_rx(struct net_device *dev, int bufnum);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment