aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/skge.c
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@osdl.org>2005-09-09 15:54:56 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-09-14 08:32:07 -0400
commit46a60f2d718d56bba8695d6f1145eb40548d86f8 (patch)
tree2d4ef2035baac15a36dbad636ac84922c021f97f /drivers/net/skge.c
parentc535a9dd26d1a4c6dcbd486cbe181a9e71237af1 (diff)
[PATCH] skge: gmac register access errors in dual port
Merge of four previous patches and the Kconfig fix * Remove debug printk's * whitespace cleanup and version number change * clear interrupts, reset phy, and reset hardware on shutdown * ignore 64bit counter overflow interrupts * fix a couple of places where second port could clobber state of first port. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/skge.c')
-rw-r--r--drivers/net/skge.c98
1 files changed, 54 insertions, 44 deletions
diff --git a/drivers/net/skge.c b/drivers/net/skge.c
index d7c98515fdfd..0208258e7826 100644
--- a/drivers/net/skge.c
+++ b/drivers/net/skge.c
@@ -42,7 +42,7 @@
42#include "skge.h" 42#include "skge.h"
43 43
44#define DRV_NAME "skge" 44#define DRV_NAME "skge"
45#define DRV_VERSION "0.9" 45#define DRV_VERSION "1.0"
46#define PFX DRV_NAME " " 46#define PFX DRV_NAME " "
47 47
48#define DEFAULT_TX_RING_SIZE 128 48#define DEFAULT_TX_RING_SIZE 128
@@ -669,7 +669,7 @@ static void skge_led(struct skge_port *skge, enum led_mode mode)
669 PHY_M_LED_BLINK_RT(BLINK_84MS) | 669 PHY_M_LED_BLINK_RT(BLINK_84MS) |
670 PHY_M_LEDC_TX_CTRL | 670 PHY_M_LEDC_TX_CTRL |
671 PHY_M_LEDC_DP_CTRL); 671 PHY_M_LEDC_DP_CTRL);
672 672
673 gm_phy_write(hw, port, PHY_MARV_LED_OVER, 673 gm_phy_write(hw, port, PHY_MARV_LED_OVER,
674 PHY_M_LED_MO_RX(MO_LED_OFF) | 674 PHY_M_LED_MO_RX(MO_LED_OFF) |
675 (skge->speed == SPEED_100 ? 675 (skge->speed == SPEED_100 ?
@@ -876,7 +876,7 @@ static int skge_rx_fill(struct skge_port *skge)
876 876
877static void skge_link_up(struct skge_port *skge) 877static void skge_link_up(struct skge_port *skge)
878{ 878{
879 skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), 879 skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG),
880 LED_BLK_OFF|LED_SYNC_OFF|LED_ON); 880 LED_BLK_OFF|LED_SYNC_OFF|LED_ON);
881 881
882 netif_carrier_on(skge->netdev); 882 netif_carrier_on(skge->netdev);
@@ -987,6 +987,8 @@ static void genesis_reset(struct skge_hw *hw, int port)
987{ 987{
988 const u8 zero[8] = { 0 }; 988 const u8 zero[8] = { 0 };
989 989
990 skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
991
990 /* reset the statistics module */ 992 /* reset the statistics module */
991 xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT); 993 xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT);
992 xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */ 994 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 (void) xm_phy_read(hw, port, PHY_BCOM_STAT); 1023 (void) xm_phy_read(hw, port, PHY_BCOM_STAT);
1022 status = xm_phy_read(hw, port, PHY_BCOM_STAT); 1024 status = xm_phy_read(hw, port, PHY_BCOM_STAT);
1023 1025
1024 pr_debug("bcom_check_link status=0x%x\n", status);
1025
1026 if ((status & PHY_ST_LSYNC) == 0) { 1026 if ((status & PHY_ST_LSYNC) == 0) {
1027 u16 cmd = xm_read16(hw, port, XM_MMU_CMD); 1027 u16 cmd = xm_read16(hw, port, XM_MMU_CMD);
1028 cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX); 1028 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 { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 }, 1106 { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 },
1107 }; 1107 };
1108 1108
1109 pr_debug("bcom_phy_init\n");
1110
1111 /* read Id from external PHY (all have the same address) */ 1109 /* read Id from external PHY (all have the same address) */
1112 id1 = xm_phy_read(hw, port, PHY_XMAC_ID1); 1110 id1 = xm_phy_read(hw, port, PHY_XMAC_ID1);
1113 1111
@@ -1340,6 +1338,8 @@ static void genesis_stop(struct skge_port *skge)
1340 int port = skge->port; 1338 int port = skge->port;
1341 u32 reg; 1339 u32 reg;
1342 1340
1341 genesis_reset(hw, port);
1342
1343 /* Clear Tx packet arbiter timeout IRQ */ 1343 /* Clear Tx packet arbiter timeout IRQ */
1344 skge_write16(hw, B3_PA_CTRL, 1344 skge_write16(hw, B3_PA_CTRL,
1345 port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2); 1345 port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2);
@@ -1465,7 +1465,6 @@ static void genesis_link_up(struct skge_port *skge)
1465 u16 cmd; 1465 u16 cmd;
1466 u32 mode, msk; 1466 u32 mode, msk;
1467 1467
1468 pr_debug("genesis_link_up\n");
1469 cmd = xm_read16(hw, port, XM_MMU_CMD); 1468 cmd = xm_read16(hw, port, XM_MMU_CMD);
1470 1469
1471 /* 1470 /*
@@ -1578,7 +1577,6 @@ static void yukon_init(struct skge_hw *hw, int port)
1578 struct skge_port *skge = netdev_priv(hw->dev[port]); 1577 struct skge_port *skge = netdev_priv(hw->dev[port]);
1579 u16 ctrl, ct1000, adv; 1578 u16 ctrl, ct1000, adv;
1580 1579
1581 pr_debug("yukon_init\n");
1582 if (skge->autoneg == AUTONEG_ENABLE) { 1580 if (skge->autoneg == AUTONEG_ENABLE) {
1583 u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); 1581 u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL);
1584 1582
@@ -1677,9 +1675,11 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
1677 1675
1678 /* WA code for COMA mode -- set PHY reset */ 1676 /* WA code for COMA mode -- set PHY reset */
1679 if (hw->chip_id == CHIP_ID_YUKON_LITE && 1677 if (hw->chip_id == CHIP_ID_YUKON_LITE &&
1680 hw->chip_rev >= CHIP_REV_YU_LITE_A3) 1678 hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
1681 skge_write32(hw, B2_GP_IO, 1679 reg = skge_read32(hw, B2_GP_IO);
1682 (skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9)); 1680 reg |= GP_DIR_9 | GP_IO_9;
1681 skge_write32(hw, B2_GP_IO, reg);
1682 }
1683 1683
1684 /* hard reset */ 1684 /* hard reset */
1685 skge_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); 1685 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 1687
1688 /* WA code for COMA mode -- clear PHY reset */ 1688 /* WA code for COMA mode -- clear PHY reset */
1689 if (hw->chip_id == CHIP_ID_YUKON_LITE && 1689 if (hw->chip_id == CHIP_ID_YUKON_LITE &&
1690 hw->chip_rev >= CHIP_REV_YU_LITE_A3) 1690 hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
1691 skge_write32(hw, B2_GP_IO, 1691 reg = skge_read32(hw, B2_GP_IO);
1692 (skge_read32(hw, B2_GP_IO) | GP_DIR_9) 1692 reg |= GP_DIR_9;
1693 & ~GP_IO_9); 1693 reg &= ~GP_IO_9;
1694 skge_write32(hw, B2_GP_IO, reg);
1695 }
1694 1696
1695 /* Set hardware config mode */ 1697 /* Set hardware config mode */
1696 reg = GPC_INT_POL_HI | GPC_DIS_FC | GPC_DIS_SLEEP | 1698 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 } 1731 }
1730 1732
1731 gma_write16(hw, port, GM_GP_CTRL, reg); 1733 gma_write16(hw, port, GM_GP_CTRL, reg);
1732 skge_read16(hw, GMAC_IRQ_SRC); 1734 skge_read16(hw, SK_REG(port, GMAC_IRQ_SRC));
1733 1735
1734 yukon_init(hw, port); 1736 yukon_init(hw, port);
1735 1737
@@ -1801,20 +1803,26 @@ static void yukon_stop(struct skge_port *skge)
1801 struct skge_hw *hw = skge->hw; 1803 struct skge_hw *hw = skge->hw;
1802 int port = skge->port; 1804 int port = skge->port;
1803 1805
1804 if (hw->chip_id == CHIP_ID_YUKON_LITE && 1806 skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), 0);
1805 hw->chip_rev >= CHIP_REV_YU_LITE_A3) { 1807 yukon_reset(hw, port);
1806 skge_write32(hw, B2_GP_IO,
1807 skge_read32(hw, B2_GP_IO) | GP_DIR_9 | GP_IO_9);
1808 }
1809 1808
1810 gma_write16(hw, port, GM_GP_CTRL, 1809 gma_write16(hw, port, GM_GP_CTRL,
1811 gma_read16(hw, port, GM_GP_CTRL) 1810 gma_read16(hw, port, GM_GP_CTRL)
1812 & ~(GM_GPCR_TX_ENA|GM_GPCR_RX_ENA)); 1811 & ~(GM_GPCR_TX_ENA|GM_GPCR_RX_ENA));
1813 gma_read16(hw, port, GM_GP_CTRL); 1812 gma_read16(hw, port, GM_GP_CTRL);
1814 1813
1814 if (hw->chip_id == CHIP_ID_YUKON_LITE &&
1815 hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
1816 u32 io = skge_read32(hw, B2_GP_IO);
1817
1818 io |= GP_DIR_9 | GP_IO_9;
1819 skge_write32(hw, B2_GP_IO, io);
1820 skge_read32(hw, B2_GP_IO);
1821 }
1822
1815 /* set GPHY Control reset */ 1823 /* set GPHY Control reset */
1816 skge_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); 1824 skge_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
1817 skge_write32(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET); 1825 skge_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_SET);
1818} 1826}
1819 1827
1820static void yukon_get_stats(struct skge_port *skge, u64 *data) 1828static void yukon_get_stats(struct skge_port *skge, u64 *data)
@@ -1873,10 +1881,8 @@ static void yukon_link_up(struct skge_port *skge)
1873 int port = skge->port; 1881 int port = skge->port;
1874 u16 reg; 1882 u16 reg;
1875 1883
1876 pr_debug("yukon_link_up\n");
1877
1878 /* Enable Transmit FIFO Underrun */ 1884 /* Enable Transmit FIFO Underrun */
1879 skge_write8(hw, GMAC_IRQ_MSK, GMAC_DEF_MSK); 1885 skge_write8(hw, SK_REG(port, GMAC_IRQ_MSK), GMAC_DEF_MSK);
1880 1886
1881 reg = gma_read16(hw, port, GM_GP_CTRL); 1887 reg = gma_read16(hw, port, GM_GP_CTRL);
1882 if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE) 1888 if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE)
@@ -1896,7 +1902,6 @@ static void yukon_link_down(struct skge_port *skge)
1896 int port = skge->port; 1902 int port = skge->port;
1897 u16 ctrl; 1903 u16 ctrl;
1898 1904
1899 pr_debug("yukon_link_down\n");
1900 gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0); 1905 gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);
1901 1906
1902 ctrl = gma_read16(hw, port, GM_GP_CTRL); 1907 ctrl = gma_read16(hw, port, GM_GP_CTRL);
@@ -2112,7 +2117,6 @@ static int skge_up(struct net_device *dev)
2112 skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F); 2117 skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
2113 skge_led(skge, LED_MODE_ON); 2118 skge_led(skge, LED_MODE_ON);
2114 2119
2115 pr_debug("skge_up completed\n");
2116 return 0; 2120 return 0;
2117 2121
2118 free_rx_ring: 2122 free_rx_ring:
@@ -2135,15 +2139,20 @@ static int skge_down(struct net_device *dev)
2135 2139
2136 netif_stop_queue(dev); 2140 netif_stop_queue(dev);
2137 2141
2142 skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), LED_OFF);
2143 if (hw->chip_id == CHIP_ID_GENESIS)
2144 genesis_stop(skge);
2145 else
2146 yukon_stop(skge);
2147
2148 hw->intr_mask &= ~portirqmask[skge->port];
2149 skge_write32(hw, B0_IMSK, hw->intr_mask);
2150
2138 /* Stop transmitter */ 2151 /* Stop transmitter */
2139 skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP); 2152 skge_write8(hw, Q_ADDR(txqaddr[port], Q_CSR), CSR_STOP);
2140 skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL), 2153 skge_write32(hw, RB_ADDR(txqaddr[port], RB_CTRL),
2141 RB_RST_SET|RB_DIS_OP_MD); 2154 RB_RST_SET|RB_DIS_OP_MD);
2142 2155
2143 if (hw->chip_id == CHIP_ID_GENESIS)
2144 genesis_stop(skge);
2145 else
2146 yukon_stop(skge);
2147 2156
2148 /* Disable Force Sync bit and Enable Alloc bit */ 2157 /* Disable Force Sync bit and Enable Alloc bit */
2149 skge_write8(hw, SK_REG(port, TXA_CTRL), 2158 skge_write8(hw, SK_REG(port, TXA_CTRL),
@@ -2367,8 +2376,6 @@ static void genesis_set_multicast(struct net_device *dev)
2367 u32 mode; 2376 u32 mode;
2368 u8 filter[8]; 2377 u8 filter[8];
2369 2378
2370 pr_debug("genesis_set_multicast flags=%x count=%d\n", dev->flags, dev->mc_count);
2371
2372 mode = xm_read32(hw, port, XM_MODE); 2379 mode = xm_read32(hw, port, XM_MODE);
2373 mode |= XM_MD_ENA_HASH; 2380 mode |= XM_MD_ENA_HASH;
2374 if (dev->flags & IFF_PROMISC) 2381 if (dev->flags & IFF_PROMISC)
@@ -2530,8 +2537,6 @@ static int skge_poll(struct net_device *dev, int *budget)
2530 unsigned int to_do = min(dev->quota, *budget); 2537 unsigned int to_do = min(dev->quota, *budget);
2531 unsigned int work_done = 0; 2538 unsigned int work_done = 0;
2532 2539
2533 pr_debug("skge_poll\n");
2534
2535 for (e = ring->to_clean; work_done < to_do; e = e->next) { 2540 for (e = ring->to_clean; work_done < to_do; e = e->next) {
2536 struct skge_rx_desc *rd = e->desc; 2541 struct skge_rx_desc *rd = e->desc;
2537 struct sk_buff *skb; 2542 struct sk_buff *skb;
@@ -2672,9 +2677,9 @@ static void skge_error_irq(struct skge_hw *hw)
2672 if (hw->chip_id == CHIP_ID_GENESIS) { 2677 if (hw->chip_id == CHIP_ID_GENESIS) {
2673 /* clear xmac errors */ 2678 /* clear xmac errors */
2674 if (hwstatus & (IS_NO_STAT_M1|IS_NO_TIST_M1)) 2679 if (hwstatus & (IS_NO_STAT_M1|IS_NO_TIST_M1))
2675 skge_write16(hw, SK_REG(0, RX_MFF_CTRL1), MFF_CLR_INSTAT); 2680 skge_write16(hw, RX_MFF_CTRL1, MFF_CLR_INSTAT);
2676 if (hwstatus & (IS_NO_STAT_M2|IS_NO_TIST_M2)) 2681 if (hwstatus & (IS_NO_STAT_M2|IS_NO_TIST_M2))
2677 skge_write16(hw, SK_REG(0, RX_MFF_CTRL2), MFF_CLR_INSTAT); 2682 skge_write16(hw, RX_MFF_CTRL2, MFF_CLR_INSTAT);
2678 } else { 2683 } else {
2679 /* Timestamp (unused) overflow */ 2684 /* Timestamp (unused) overflow */
2680 if (hwstatus & IS_IRQ_TIST_OV) 2685 if (hwstatus & IS_IRQ_TIST_OV)
@@ -3000,9 +3005,6 @@ static int skge_reset(struct skge_hw *hw)
3000 3005
3001 skge_write32(hw, B0_IMSK, hw->intr_mask); 3006 skge_write32(hw, B0_IMSK, hw->intr_mask);
3002 3007
3003 if (hw->chip_id != CHIP_ID_GENESIS)
3004 skge_write8(hw, GMAC_IRQ_MSK, 0);
3005
3006 spin_lock_bh(&hw->phy_lock); 3008 spin_lock_bh(&hw->phy_lock);
3007 for (i = 0; i < hw->ports; i++) { 3009 for (i = 0; i < hw->ports; i++) {
3008 if (hw->chip_id == CHIP_ID_GENESIS) 3010 if (hw->chip_id == CHIP_ID_GENESIS)
@@ -3230,6 +3232,11 @@ static void __devexit skge_remove(struct pci_dev *pdev)
3230 dev0 = hw->dev[0]; 3232 dev0 = hw->dev[0];
3231 unregister_netdev(dev0); 3233 unregister_netdev(dev0);
3232 3234
3235 skge_write32(hw, B0_IMSK, 0);
3236 skge_write16(hw, B0_LED, LED_STAT_OFF);
3237 skge_pci_clear(hw);
3238 skge_write8(hw, B0_CTST, CS_RST_SET);
3239
3233 tasklet_kill(&hw->ext_tasklet); 3240 tasklet_kill(&hw->ext_tasklet);
3234 3241
3235 free_irq(pdev->irq, hw); 3242 free_irq(pdev->irq, hw);
@@ -3238,7 +3245,7 @@ static void __devexit skge_remove(struct pci_dev *pdev)
3238 if (dev1) 3245 if (dev1)
3239 free_netdev(dev1); 3246 free_netdev(dev1);
3240 free_netdev(dev0); 3247 free_netdev(dev0);
3241 skge_write16(hw, B0_LED, LED_STAT_OFF); 3248
3242 iounmap(hw->regs); 3249 iounmap(hw->regs);
3243 kfree(hw); 3250 kfree(hw);
3244 pci_set_drvdata(pdev, NULL); 3251 pci_set_drvdata(pdev, NULL);
@@ -3257,7 +3264,10 @@ static int skge_suspend(struct pci_dev *pdev, pm_message_t state)
3257 struct skge_port *skge = netdev_priv(dev); 3264 struct skge_port *skge = netdev_priv(dev);
3258 if (netif_running(dev)) { 3265 if (netif_running(dev)) {
3259 netif_carrier_off(dev); 3266 netif_carrier_off(dev);
3260 skge_down(dev); 3267 if (skge->wol)
3268 netif_stop_queue(dev);
3269 else
3270 skge_down(dev);
3261 } 3271 }
3262 netif_device_detach(dev); 3272 netif_device_detach(dev);
3263 wol |= skge->wol; 3273 wol |= skge->wol;