Commit 186051d7 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

parents 668e4bc7 e172577d
...@@ -1951,7 +1951,7 @@ config SKGE ...@@ -1951,7 +1951,7 @@ config SKGE
---help--- ---help---
This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx
and related Gigabit Ethernet adapters. It is a new smaller driver and related Gigabit Ethernet adapters. It is a new smaller driver
driver with better performance and more complete ethtool support. with better performance and more complete ethtool support.
It does not support the link failover and network management It does not support the link failover and network management
features that "portable" vendor supplied sk98lin driver does. features that "portable" vendor supplied sk98lin driver does.
......
...@@ -1387,13 +1387,13 @@ static void e100_update_stats(struct nic *nic) ...@@ -1387,13 +1387,13 @@ static void e100_update_stats(struct nic *nic)
ns->collisions += nic->tx_collisions; ns->collisions += nic->tx_collisions;
ns->tx_errors += le32_to_cpu(s->tx_max_collisions) + ns->tx_errors += le32_to_cpu(s->tx_max_collisions) +
le32_to_cpu(s->tx_lost_crs); le32_to_cpu(s->tx_lost_crs);
ns->rx_dropped += le32_to_cpu(s->rx_resource_errors);
ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) + ns->rx_length_errors += le32_to_cpu(s->rx_short_frame_errors) +
nic->rx_over_length_errors; nic->rx_over_length_errors;
ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors); ns->rx_crc_errors += le32_to_cpu(s->rx_crc_errors);
ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors); ns->rx_frame_errors += le32_to_cpu(s->rx_alignment_errors);
ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors); ns->rx_over_errors += le32_to_cpu(s->rx_overrun_errors);
ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors); ns->rx_fifo_errors += le32_to_cpu(s->rx_overrun_errors);
ns->rx_missed_errors += le32_to_cpu(s->rx_resource_errors);
ns->rx_errors += le32_to_cpu(s->rx_crc_errors) + ns->rx_errors += le32_to_cpu(s->rx_crc_errors) +
le32_to_cpu(s->rx_alignment_errors) + le32_to_cpu(s->rx_alignment_errors) +
le32_to_cpu(s->rx_short_frame_errors) + le32_to_cpu(s->rx_short_frame_errors) +
...@@ -1727,12 +1727,10 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx, ...@@ -1727,12 +1727,10 @@ static inline int e100_rx_indicate(struct nic *nic, struct rx *rx,
if(unlikely(!(rfd_status & cb_ok))) { if(unlikely(!(rfd_status & cb_ok))) {
/* Don't indicate if hardware indicates errors */ /* Don't indicate if hardware indicates errors */
nic->net_stats.rx_dropped++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} else if(actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) { } else if(actual_size > ETH_DATA_LEN + VLAN_ETH_HLEN) {
/* Don't indicate oversized frames */ /* Don't indicate oversized frames */
nic->rx_over_length_errors++; nic->rx_over_length_errors++;
nic->net_stats.rx_dropped++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} else { } else {
nic->net_stats.rx_packets++; nic->net_stats.rx_packets++;
......
...@@ -2544,7 +2544,6 @@ e1000_update_stats(struct e1000_adapter *adapter) ...@@ -2544,7 +2544,6 @@ e1000_update_stats(struct e1000_adapter *adapter)
adapter->stats.crcerrs + adapter->stats.algnerrc + adapter->stats.crcerrs + adapter->stats.algnerrc +
adapter->stats.rlec + adapter->stats.mpc + adapter->stats.rlec + adapter->stats.mpc +
adapter->stats.cexterr; adapter->stats.cexterr;
adapter->net_stats.rx_dropped = adapter->stats.mpc;
adapter->net_stats.rx_length_errors = adapter->stats.rlec; adapter->net_stats.rx_length_errors = adapter->stats.rlec;
adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs; adapter->net_stats.rx_crc_errors = adapter->stats.crcerrs;
adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc; adapter->net_stats.rx_frame_errors = adapter->stats.algnerrc;
......
...@@ -1616,8 +1616,6 @@ ixgb_update_stats(struct ixgb_adapter *adapter) ...@@ -1616,8 +1616,6 @@ ixgb_update_stats(struct ixgb_adapter *adapter)
adapter->stats.icbc + adapter->stats.icbc +
adapter->stats.ecbc + adapter->stats.mpc; adapter->stats.ecbc + adapter->stats.mpc;
adapter->net_stats.rx_dropped = adapter->stats.mpc;
/* see above /* see above
* adapter->net_stats.rx_length_errors = adapter->stats.rlec; * adapter->net_stats.rx_length_errors = adapter->stats.rlec;
*/ */
......
...@@ -428,7 +428,7 @@ static int init_shared_mem(struct s2io_nic *nic) ...@@ -428,7 +428,7 @@ static int init_shared_mem(struct s2io_nic *nic)
DBG_PRINT(INIT_DBG, DBG_PRINT(INIT_DBG,
"%s: Zero DMA address for TxDL. ", dev->name); "%s: Zero DMA address for TxDL. ", dev->name);
DBG_PRINT(INIT_DBG, DBG_PRINT(INIT_DBG,
"Virtual address %llx\n", (u64)tmp_v); "Virtual address %p\n", tmp_v);
tmp_v = pci_alloc_consistent(nic->pdev, tmp_v = pci_alloc_consistent(nic->pdev,
PAGE_SIZE, &tmp_p); PAGE_SIZE, &tmp_p);
if (!tmp_v) { if (!tmp_v) {
...@@ -657,9 +657,10 @@ static void free_shared_mem(struct s2io_nic *nic) ...@@ -657,9 +657,10 @@ static void free_shared_mem(struct s2io_nic *nic)
mac_control->zerodma_virt_addr, mac_control->zerodma_virt_addr,
(dma_addr_t)0); (dma_addr_t)0);
DBG_PRINT(INIT_DBG, DBG_PRINT(INIT_DBG,
"%s: Freeing TxDL with zero DMA addr. ", dev->name); "%s: Freeing TxDL with zero DMA addr. ",
DBG_PRINT(INIT_DBG, "Virtual address %llx\n", dev->name);
(u64)(mac_control->zerodma_virt_addr)); DBG_PRINT(INIT_DBG, "Virtual address %p\n",
mac_control->zerodma_virt_addr);
} }
kfree(mac_control->fifos[i].list_info); kfree(mac_control->fifos[i].list_info);
} }
......
...@@ -5216,17 +5216,15 @@ static struct pci_device_id skge_pci_tbl[] = { ...@@ -5216,17 +5216,15 @@ static struct pci_device_id skge_pci_tbl[] = {
{ PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_3COM, 0x80eb, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_SYSKONNECT, 0x4300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_SYSKONNECT, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* DLink card does not have valid VPD so this driver gags
* { PCI_VENDOR_ID_DLINK, 0x4c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
*/
{ PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_MARVELL, 0x4320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
#if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */
{ PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
#endif
{ PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_MARVELL, 0x5005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_CNET, 0x434e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0015, },
{ PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { PCI_VENDOR_ID_LINKSYS, 0x1064, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0, } { 0 }
}; };
MODULE_DEVICE_TABLE(pci, skge_pci_tbl); MODULE_DEVICE_TABLE(pci, skge_pci_tbl);
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#include "skge.h" #include "skge.h"
#define DRV_NAME "skge" #define DRV_NAME "skge"
#define DRV_VERSION "0.9" #define DRV_VERSION "1.0"
#define PFX DRV_NAME " " #define PFX DRV_NAME " "
#define DEFAULT_TX_RING_SIZE 128 #define DEFAULT_TX_RING_SIZE 128
...@@ -669,7 +669,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode) ...@@ -669,7 +669,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode)
PHY_M_LED_BLINK_RT(BLINK_84MS) | PHY_M_LED_BLINK_RT(BLINK_84MS) |
PHY_M_LEDC_TX_CTRL | PHY_M_LEDC_TX_CTRL |
PHY_M_LEDC_DP_CTRL); PHY_M_LEDC_DP_CTRL);
gm_phy_write(hw, port, PHY_MARV_LED_OVER, gm_phy_write(hw, port, PHY_MARV_LED_OVER,
PHY_M_LED_MO_RX(MO_LED_OFF) | PHY_M_LED_MO_RX(MO_LED_OFF) |
(skge->speed == SPEED_100 ? (skge->speed == SPEED_100 ?
...@@ -876,7 +876,7 @@ static int skge_rx_fill(struct skge_port *skge) ...@@ -876,7 +876,7 @@ static int skge_rx_fill(struct skge_port *skge)
static void skge_link_up(struct skge_port *skge) static void skge_link_up(struct skge_port *skge)
{ {
skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG),
LED_BLK_OFF|LED_SYNC_OFF|LED_ON); LED_BLK_OFF|LED_SYNC_OFF|LED_ON);
netif_carrier_on(skge->netdev); netif_carrier_on(skge->netdev);
...@@ -987,6 +987,8 @@ static void genesis_reset(struct skge_hw *hw, int port) ...@@ -987,6 +987,8 @@ static void genesis_reset(struct skge_hw *hw, int port)
{ {
const u8 zero[8] = { 0 }; const u8 zero[8] = { 0 };
skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
/* reset the statistics module */ /* reset the statistics module */
xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT); xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT);
xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */ xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */
...@@ -1021,8 +1023,6 @@ static void bcom_check_link(struct skge_hw *hw, int port) ...@@ -1021,8 +1023,6 @@ static void bcom_check_link(struct skge_hw *hw, int port)
(void) xm_phy_read(hw, port, PHY_BCOM_STAT); (void) xm_phy_read(hw, port, PHY_BCOM_STAT);
status = xm_phy_read(hw, port, PHY_BCOM_STAT); status = xm_phy_read(hw, port, PHY_BCOM_STAT);
pr_debug("bcom_check_link status=0x%x\n", status);
if ((status & PHY_ST_LSYNC) == 0) { if ((status & PHY_ST_LSYNC) == 0) {
u16 cmd = xm_read16(hw, port, XM_MMU_CMD); u16 cmd = xm_read16(hw, port, XM_MMU_CMD);
cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX); cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
...@@ -1106,8 +1106,6 @@ static void bcom_phy_init(struct skge_port *skge, int jumbo) ...@@ -1106,8 +1106,6 @@ static void bcom_phy_init(struct skge_port *skge, int jumbo)
{ 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 }, { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 },
}; };
pr_debug("bcom_phy_init\n");
/* read Id from external PHY (all have the same address) */ /* read Id from external PHY (all have the same address) */
id1 = xm_phy_read(hw, port, PHY_XMAC_ID1); id1 = xm_phy_read(hw, port, PHY_XMAC_ID1);
...@@ -1340,6 +1338,8 @@ static void genesis_stop(struct skge_port *skge) ...@@ -1340,6 +1338,8 @@ static void genesis_stop(struct skge_port *skge)
int port = skge->port; int port = skge->port;
u32 reg; u32 reg;
genesis_reset(hw, port);
/* Clear Tx packet arbiter timeout IRQ */ /* Clear Tx packet arbiter timeout IRQ */
skge_write16(hw, B3_PA_CTRL, skge_write16(hw, B3_PA_CTRL,
port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2); port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2);
...@@ -1465,7 +1465,6 @@ static void genesis_link_up(struct skge_port *skge) ...@@ -1465,7 +1465,6 @@ static void genesis_link_up(struct skge_port *skge)
u16 cmd; u16 cmd;
u32 mode, msk; u32 mode, msk;
pr_debug("genesis_link_up\n");
cmd = xm_read16(hw, port, XM_MMU_CMD); cmd = xm_read16(hw, port, XM_MMU_CMD);
/* /*
...@@ -1578,7 +1577,6 @@ static void yukon_init(struct skge_hw *hw, int port) ...@@ -1578,7 +1577,6 @@ static void yukon_init(struct skge_hw *hw, int port)
struct skge_port *skge = netdev_priv(hw->dev[port]); struct skge_port *skge = netdev_priv(hw->dev[port]);
u16 ctrl, ct1000, adv; u16 ctrl, ct1000, adv;
pr_debug("yukon_init\n");
if (skge->autoneg == AUTONEG_ENABLE) { if (skge->autoneg == AUTONEG_ENABLE) {
u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL);
...@@ -1677,9 +1675,11 @@ static void yukon_mac_init(struct skge_hw *hw, int port) ...@@ -1677,9 +1675,11 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
/* WA code for COMA mode -- set PHY reset */ /* WA code for COMA mode -- set PHY reset */
if (hw->chip_id == CHIP_ID_YUKON_LITE && if (hw->chip_id == CHIP_ID_YUKON_LITE &&
hw->chip_rev >= CHIP_REV_YU_LITE_A3) hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
skge_write32(hw, B2_GP_IO, reg = skge_read32(hw, B2_GP_IO);
(skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9)); reg |= GP_DIR_9 | GP_IO_9;
skge_write32(hw, B2_GP_IO, reg);
}
/* hard reset */ /* hard reset */
skge_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); skge_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
...@@ -1687,10 +1687,12 @@ static void yukon_mac_init(struct skge_hw *hw, int port) ...@@ -1687,10 +1687,12 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
/* WA code for COMA mode -- clear PHY reset */ /* WA code for COMA mode -- clear PHY reset */
if (hw->chip_id == CHIP_ID_YUKON_LITE && if (hw->chip_id == CHIP_ID_YUKON_LITE &&
hw->chip_rev >= CHIP_REV_YU_LITE_A3) hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
skge_write32(hw, B2_GP_IO, reg = skge_read32(hw, B2_GP_IO);
(skge_read32(hw, B2_GP_IO) | GP_DIR_9) reg |= GP_DIR_9;
& ~GP_IO_9); reg &= ~GP_IO_9;
skge_write32(hw, B2_GP_IO, reg);
}
/* Set hardware config mode */ /* Set hardware config mode */
reg = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP | reg = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP |
...@@ -1729,7 +1731,7 @@ static void yukon_mac_init(struct skge_hw *hw, int port) ...@@ -1729,7 +1731,7 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
} }
gma_write16(hw, port, GM_GP_CTRL, reg); gma_write16(hw, port, GM_GP_CTRL, reg);
skge_read16(hw, GMAC_IRQ_SRC); skge_read16(hw, SK_REG(port, GMAC_IRQ_SRC));
yukon_init(hw, port); yukon_init(hw, port);
...@@ -1801,20 +1803,26 @@ static void yukon_stop(struct skge_port *skge) ...@@ -1801,20 +1803,26 @@ static void yukon_stop(struct skge_port *skge)
struct skge_hw *hw = skge->hw; struct skge_hw *hw = skge->hw;
int port = skge->port; int port = skge->port;
if (hw->chip_id == CHIP_ID_YUKON_LITE && skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
hw->chip_rev >= CHIP_REV_YU_LITE_A3) { yukon_reset(hw, port);
skge_write32(hw, B2_GP_IO,
skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9);
}
gma_write16(hw, port, GM_GP_CTRL, gma_write16(hw, port, GM_GP_CTRL,
gma_read16(hw, port, GM_GP_CTRL) gma_read16(hw, port, GM_GP_CTRL)
& ~(GM_GPCR_TX_ENA|GM_GPCR_RX_ENA)); & ~(GM_GPCR_TX_ENA|GM_GPCR_RX_ENA));
gma_read16(hw, port, GM_GP_CTRL); gma_read16(hw, port, GM_GP_CTRL);
if (hw->chip_id == CHIP_ID_YUKON_LITE &&
hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
u32 io = skge_read32(hw, B2_GP_IO);
io |= GP_DIR_9 | GP_IO_9;
skge_write32(hw, B2_GP_IO, io);
skge_read32(hw, B2_GP_IO);
}
/* set GPHY Control reset */ /* set GPHY Control reset */
skge_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); skge_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
skge_write32(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET); skge_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);
} }
static void yukon_get_stats(struct skge_port *skge, u64 *data) static void yukon_get_stats(struct skge_port *skge, u64 *data)
...@@ -1873,10 +1881,8 @@ static void yukon_link_up(struct skge_port *skge) ...@@ -1873,10 +1881,8 @@ static void yukon_link_up(struct skge_port *skge)
int port = skge->port; int port = skge->port;
u16 reg; u16 reg;
pr_debug("yukon_link_up\n");
/* Enable Transmit FIFO Underrun */ /* Enable Transmit FIFO Underrun */
skge_write8(hw, GMAC_IRQ_MSK, GMAC_DEF_MSK); skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), GMAC_DEF_MSK);
reg = gma_read16(hw, port, GM_GP_CTRL); reg = gma_read16(hw, port, GM_GP_CTRL);
if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE) if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE)
...@@ -1896,7 +1902,6 @@ static void yukon_link_down(struct skge_port *skge) ...@@ -1896,7 +1902,6 @@ static void yukon_link_down(struct skge_port *skge)
int port = skge->port; int port = skge->port;
u16 ctrl; u16 ctrl;
pr_debug("yukon_link_down\n");
gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0); gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
ctrl = gma_read16(hw, port, GM_GP_CTRL); ctrl = gma_read16(hw, port, GM_GP_CTRL);
...@@ -2112,7 +2117,6 @@ static int skge_up(struct net_device *dev) ...@@ -2112,7 +2117,6 @@ static int skge_up(struct net_device *dev)
skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F); skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
skge_led(skge, LED_MODE_ON); skge_led(skge, LED_MODE_ON);
pr_debug("skge_up completed\n");
return 0; return 0;
free_rx_ring: free_rx_ring:
...@@ -2135,15 +2139,20 @@ static int skge_down(struct net_device *dev) ...@@ -2135,15 +2139,20 @@ static int skge_down(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), LED_OFF);
if (hw->chip_id == CHIP_ID_GENESIS)
genesis_stop(skge);
else
yukon_stop(skge);
hw->intr_mask &= ~portirqmask[skge->port];
skge_write32(hw, B0_IMSK, hw->intr_mask);
/* Stop transmitter */ /* Stop transmitter */
skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP); skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP);
skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
RB_RST_SET|RB_DIS_OP_MD); RB_RST_SET|RB_DIS_OP_MD);
if (hw->chip_id == CHIP_ID_GENESIS)
genesis_stop(skge);
else
yukon_stop(skge);
/* Disable Force Sync bit and Enable Alloc bit */ /* Disable Force Sync bit and Enable Alloc bit */
skge_write8(hw, SK_REG(port, TXA_CTRL), skge_write8(hw, SK_REG(port, TXA_CTRL),
...@@ -2367,8 +2376,6 @@ static void genesis_set_multicast(struct net_device *dev) ...@@ -2367,8 +2376,6 @@ static void genesis_set_multicast(struct net_device *dev)
u32 mode; u32 mode;
u8 filter[8]; u8 filter[8];
pr_debug("genesis_set_multicast flags=%x count=%d\n", dev->flags, dev->mc_count);
mode = xm_read32(hw, port, XM_MODE); mode = xm_read32(hw, port, XM_MODE);
mode |= XM_MD_ENA_HASH; mode |= XM_MD_ENA_HASH;
if (dev->flags & IFF_PROMISC) if (dev->flags & IFF_PROMISC)
...@@ -2530,8 +2537,6 @@ static int skge_poll(struct net_device *dev, int *budget) ...@@ -2530,8 +2537,6 @@ static int skge_poll(struct net_device *dev, int *budget)
unsigned int to_do = min(dev->quota, *budget); unsigned int to_do = min(dev->quota, *budget);
unsigned int work_done = 0; unsigned int work_done = 0;
pr_debug("skge_poll\n");
for (e = ring->to_clean; work_done < to_do; e = e->next) { for (e = ring->to_clean; work_done < to_do; e = e->next) {
struct skge_rx_desc *rd = e->desc; struct skge_rx_desc *rd = e->desc;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -2672,9 +2677,9 @@ static void skge_error_irq(struct skge_hw *hw) ...@@ -2672,9 +2677,9 @@ static void skge_error_irq(struct skge_hw *hw)
if (hw->chip_id == CHIP_ID_GENESIS) { if (hw->chip_id == CHIP_ID_GENESIS) {
/* clear xmac errors */ /* clear xmac errors */
if (hwstatus & (IS_NO_STAT_M1|IS_NO_TIST_M1)) if (hwstatus & (IS_NO_STAT_M1|IS_NO_TIST_M1))
skge_write16(hw, SK_REG(0, RX_MFF_CTRL1), MFF_CLR_INSTAT); skge_write16(hw, RX_MFF_CTRL1, MFF_CLR_INSTAT);
if (hwstatus & (IS_NO_STAT_M2|IS_NO_TIST_M2)) if (hwstatus & (IS_NO_STAT_M2|IS_NO_TIST_M2))
skge_write16(hw, SK_REG(0, RX_MFF_CTRL2), MFF_CLR_INSTAT); skge_write16(hw, RX_MFF_CTRL2, MFF_CLR_INSTAT);
} else { } else {
/* Timestamp (unused) overflow */ /* Timestamp (unused) overflow */
if (hwstatus & IS_IRQ_TIST_OV) if (hwstatus & IS_IRQ_TIST_OV)
...@@ -3000,9 +3005,6 @@ static int skge_reset(struct skge_hw *hw) ...@@ -3000,9 +3005,6 @@ static int skge_reset(struct skge_hw *hw)
skge_write32(hw, B0_IMSK, hw->intr_mask); skge_write32(hw, B0_IMSK, hw->intr_mask);
if (hw->chip_id != CHIP_ID_GENESIS)
skge_write8(hw, GMAC_IRQ_MSK, 0);
spin_lock_bh(&hw->phy_lock); spin_lock_bh(&hw->phy_lock);
for (i = 0; i < hw->ports; i++) { for (i = 0; i < hw->ports; i++) {
if (hw->chip_id == CHIP_ID_GENESIS) if (hw->chip_id == CHIP_ID_GENESIS)
...@@ -3230,6 +3232,11 @@ static void __devexit skge_remove(struct pci_dev *pdev) ...@@ -3230,6 +3232,11 @@ static void __devexit skge_remove(struct pci_dev *pdev)
dev0 = hw->dev[0]; dev0 = hw->dev[0];
unregister_netdev(dev0); unregister_netdev(dev0);
skge_write32(hw, B0_IMSK, 0);
skge_write16(hw, B0_LED, LED_STAT_OFF);
skge_pci_clear(hw);
skge_write8(hw, B0_CTST, CS_RST_SET);
tasklet_kill(&hw->ext_tasklet); tasklet_kill(&hw->ext_tasklet);
free_irq(pdev->irq, hw); free_irq(pdev->irq, hw);
...@@ -3238,7 +3245,7 @@ static void __devexit skge_remove(struct pci_dev *pdev) ...@@ -3238,7 +3245,7 @@ static void __devexit skge_remove(struct pci_dev *pdev)
if (dev1) if (dev1)
free_netdev(dev1); free_netdev(dev1);
free_netdev(dev0); free_netdev(dev0);
skge_write16(hw, B0_LED, LED_STAT_OFF);
iounmap(hw->regs); iounmap(hw->regs);
kfree(hw); kfree(hw);
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
...@@ -3257,7 +3264,10 @@ static int skge_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -3257,7 +3264,10 @@ static int skge_suspend(struct pci_dev *pdev, pm_message_t state)
struct skge_port *skge = netdev_priv(dev); struct skge_port *skge = netdev_priv(dev);
if (netif_running(dev)) { if (netif_running(dev)) {
netif_carrier_off(dev); netif_carrier_off(dev);
skge_down(dev); if (skge->wol)
netif_stop_queue(dev);
else
skge_down(dev);
} }
netif_device_detach(dev); netif_device_detach(dev);
wol |= skge->wol; wol |= skge->wol;
......
...@@ -2008,7 +2008,7 @@ enum { ...@@ -2008,7 +2008,7 @@ enum {
GM_IS_RX_FF_OR = 1<<1, /* Receive FIFO Overrun */ GM_IS_RX_FF_OR = 1<<1, /* Receive FIFO Overrun */
GM_IS_RX_COMPL = 1<<0, /* Frame Reception Complete */ GM_IS_RX_COMPL = 1<<0, /* Frame Reception Complete */
#define GMAC_DEF_MSK (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV | GM_IS_TX_FF_UR) #define GMAC_DEF_MSK (GM_IS_RX_FF_OR | GM_IS_TX_FF_UR)
/* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */ /* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */
/* Bits 15.. 2: reserved */ /* Bits 15.. 2: reserved */
......
...@@ -117,7 +117,7 @@ static int xircom_open(struct net_device *dev); ...@@ -117,7 +117,7 @@ static int xircom_open(struct net_device *dev);
static int xircom_close(struct net_device *dev); static int xircom_close(struct net_device *dev);
static void xircom_up(struct xircom_private *card); static void xircom_up(struct xircom_private *card);
static struct net_device_stats *xircom_get_stats(struct net_device *dev); static struct net_device_stats *xircom_get_stats(struct net_device *dev);
#if CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static void xircom_poll_controller(struct net_device *dev); static void xircom_poll_controller(struct net_device *dev);
#endif #endif
......
...@@ -6852,7 +6852,10 @@ static inline char *airo_translate_scan(struct net_device *dev, ...@@ -6852,7 +6852,10 @@ static inline char *airo_translate_scan(struct net_device *dev,
/* Add frequency */ /* Add frequency */
iwe.cmd = SIOCGIWFREQ; iwe.cmd = SIOCGIWFREQ;
iwe.u.freq.m = le16_to_cpu(bss->dsChannel); iwe.u.freq.m = le16_to_cpu(bss->dsChannel);
iwe.u.freq.m = frequency_list[iwe.u.freq.m] * 100000; /* iwe.u.freq.m containt the channel (starting 1), our
* frequency_list array start at index 0...
*/
iwe.u.freq.m = frequency_list[iwe.u.freq.m - 1] * 100000;
iwe.u.freq.e = 1; iwe.u.freq.e = 1;
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
......
/* /*
* $Id: ctcmain.c,v 1.74 2005/03/24 09:04:17 mschwide Exp $ * $Id: ctcmain.c,v 1.78 2005/09/07 12:18:02 pavlic Exp $
* *
* CTC / ESCON network driver * CTC / ESCON network driver
* *
...@@ -37,10 +37,9 @@ ...@@ -37,10 +37,9 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
* RELEASE-TAG: CTC/ESCON network driver $Revision: 1.74 $ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.78 $
* *
*/ */
#undef DEBUG #undef DEBUG
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -135,7 +134,7 @@ static const char *dev_event_names[] = { ...@@ -135,7 +134,7 @@ static const char *dev_event_names[] = {
"TX down", "TX down",
"Restart", "Restart",
}; };
/** /**
* Events of the channel statemachine * Events of the channel statemachine
*/ */
...@@ -249,7 +248,7 @@ static void ...@@ -249,7 +248,7 @@ static void
print_banner(void) print_banner(void)
{ {
static int printed = 0; static int printed = 0;
char vbuf[] = "$Revision: 1.74 $"; char vbuf[] = "$Revision: 1.78 $";
char *version = vbuf; char *version = vbuf;
if (printed) if (printed)
...@@ -334,7 +333,7 @@ static const char *ch_state_names[] = { ...@@ -334,7 +333,7 @@ static const char *ch_state_names[] = {
"Restarting", "Restarting",
"Not operational", "Not operational",
}; };
#ifdef DEBUG #ifdef DEBUG
/** /**
* Dump header and first 16 bytes of an sk_buff for debugging purposes. * Dump header and first 16 bytes of an sk_buff for debugging purposes.
...@@ -671,7 +670,7 @@ static void ...@@ -671,7 +670,7 @@ static void
fsm_action_nop(fsm_instance * fi, int event, void *arg) fsm_action_nop(fsm_instance * fi, int event, void *arg)
{ {
} }
/** /**
* Actions for channel - statemachines. * Actions for channel - statemachines.
*****************************************************************************/ *****************************************************************************/
...@@ -1514,7 +1513,6 @@ ch_action_reinit(fsm_instance *fi, int event, void *arg) ...@@ -1514,7 +1513,6 @@ ch_action_reinit(fsm_instance *fi, int event, void *arg)
fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev); fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev);
} }
/** /**
* The statemachine for a channel. * The statemachine for a channel.
*/ */
...@@ -1625,7 +1623,7 @@ static const fsm_node ch_fsm[] = { ...@@ -1625,7 +1623,7 @@ static const fsm_node ch_fsm[] = {
}; };
static const int CH_FSM_LEN = sizeof (ch_fsm) / sizeof (fsm_node); static const int CH_FSM_LEN = sizeof (ch_fsm) / sizeof (fsm_node);
/** /**
* Functions related to setup and device detection. * Functions related to setup and device detection.
*****************************************************************************/ *****************************************************************************/
...@@ -1976,7 +1974,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1976,7 +1974,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
fsm_event(ch->fsm, CH_EVENT_IRQ, ch); fsm_event(ch->fsm, CH_EVENT_IRQ, ch);
} }
/** /**
* Actions for interface - statemachine. * Actions for interface - statemachine.
*****************************************************************************/ *****************************************************************************/
...@@ -2209,13 +2207,18 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2209,13 +2207,18 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
int rc = 0; int rc = 0;
DBF_TEXT(trace, 5, __FUNCTION__); DBF_TEXT(trace, 5, __FUNCTION__);
/* we need to acquire the lock for testing the state
* otherwise we can have an IRQ changing the state to
* TXIDLE after the test but before acquiring the lock.
*/
spin_lock_irqsave(&ch->collect_lock, saveflags);
if (fsm_getstate(ch->fsm) != CH_STATE_TXIDLE) { if (fsm_getstate(ch->fsm) != CH_STATE_TXIDLE) {
int l = skb->len + LL_HEADER_LENGTH; int l = skb->len + LL_HEADER_LENGTH;
spin_lock_irqsave(&ch->collect_lock, saveflags); if (ch->collect_len + l > ch->max_bufsize - 2) {
if (ch->collect_len + l > ch->max_bufsize - 2) spin_unlock_irqrestore(&ch->collect_lock, saveflags);
rc = -EBUSY; return -EBUSY;
else { } else {
atomic_inc(&skb->users); atomic_inc(&skb->users);
header.length = l; header.length = l;
header.type = skb->protocol; header.type = skb->protocol;
...@@ -2231,7 +2234,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2231,7 +2234,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
int ccw_idx; int ccw_idx;
struct sk_buff *nskb; struct sk_buff *nskb;
unsigned long hi; unsigned long hi;
spin_unlock_irqrestore(&ch->collect_lock, saveflags);
/** /**
* Protect skb against beeing free'd by upper * Protect skb against beeing free'd by upper
* layers. * layers.
...@@ -2256,6 +2259,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2256,6 +2259,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
if (!nskb) { if (!nskb) {
atomic_dec(&skb->users); atomic_dec(&skb->users);
skb_pull(skb, LL_HEADER_LENGTH + 2); skb_pull(skb, LL_HEADER_LENGTH + 2);
ctc_clear_busy(ch->netdev);
return -ENOMEM; return -ENOMEM;
} else { } else {
memcpy(skb_put(nskb, skb->len), memcpy(skb_put(nskb, skb->len),
...@@ -2281,6 +2285,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2281,6 +2285,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
*/ */
atomic_dec(&skb->users); atomic_dec(&skb->users);
skb_pull(skb, LL_HEADER_LENGTH + 2); skb_pull(skb, LL_HEADER_LENGTH + 2);
ctc_clear_busy(ch->netdev);
return -EBUSY; return -EBUSY;
} }
...@@ -2327,9 +2332,10 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2327,9 +2332,10 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
} }
} }
ctc_clear_busy(ch->netdev);
return rc; return rc;
} }
/** /**
* Interface API for upper network layers * Interface API for upper network layers
*****************************************************************************/ *****************************************************************************/
...@@ -2421,7 +2427,6 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev) ...@@ -2421,7 +2427,6 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev)
dev->trans_start = jiffies; dev->trans_start = jiffies;
if (transmit_skb(privptr->channel[WRITE], skb) != 0) if (transmit_skb(privptr->channel[WRITE], skb) != 0)
rc = 1; rc = 1;
ctc_clear_busy(dev);
return rc; return rc;
} }
...@@ -2610,7 +2615,6 @@ stats_write(struct device *dev, struct device_attribute *attr, const char *buf, ...@@ -2610,7 +2615,6 @@ stats_write(struct device *dev, struct device_attribute *attr, const char *buf,
return count; return count;
} }
static void static void
ctc_netdev_unregister(struct net_device * dev) ctc_netdev_unregister(struct net_device * dev)
{ {
...@@ -2685,7 +2689,6 @@ ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *b ...@@ -2685,7 +2689,6 @@ ctc_proto_store(struct device *dev, struct device_attribute *attr, const char *b
return count; return count;
} }
static ssize_t static ssize_t
ctc_type_show(struct device *dev, struct device_attribute *attr, char *buf) ctc_type_show(struct device *dev, struct device_attribute *attr, char *buf)
{ {
......
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