From: Sascha Hauer <[EMAIL PROTECTED]> The ethernet firmware revision 1007 fixes several issues with the network chip. This update makes the driver work with that firmware revision.
Signed-off-by: Sascha Hauer <[EMAIL PROTECTED]> --- drivers/net/netx-eth.c | 91 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 18 deletions(-) Index: drivers/net/netx-eth.c =================================================================== --- drivers/net/netx-eth.c.orig +++ drivers/net/netx-eth.c @@ -71,18 +71,29 @@ #define FIFO_PTR_ERROR_MASK (0xf << 28) #define ISR_LINK_STATUS_CHANGE (1<<4) -#define ISR_IND_LO (1<<3) -#define ISR_CON_LO (1<<2) -#define ISR_IND_HI (1<<1) -#define ISR_CON_HI (1<<0) +#define ISR_IND_LO (priv->xc_version >= 1007 ? (1<<1) : (1<<3)) +#define ISR_CON_LO (priv->xc_version >= 1007 ? (1<<3) : (1<<2)) +#define ISR_IND_HI (priv->xc_version >= 1007 ? (1<<0) : (1<<1)) +#define ISR_CON_HI (priv->xc_version >= 1007 ? (1<<2) : (1<<0)) #define ETH_MAC_LOCAL_CONFIG 0x1560 -#define ETH_MAC_4321 0x1564 -#define ETH_MAC_65 0x1568 + +/* Firmware >= 1.007 */ +#define ETH_MAC_IRQ_ENABLE 0x1564 +#define IRQ_ENABLE_IND_HI (1<<0) +#define IRQ_ENABLE_IND_LO (1<<1) +#define IRQ_ENABLE_CON_HI (1<<2) +#define IRQ_ENABLE_CON_LO (1<<3) +#define IRQ_ENABLE_LINK_STATUS (1<<4) + +#define ETH_MAC_4321 (0x1564 + ((priv->xc_version >= 1007) ? 4 : 0)) +#define ETH_MAC_65 (0x1568 + ((priv->xc_version >= 1007) ? 4 : 0)) #define MAC_TRAFFIC_CLASS_ARRANGEMENT_SHIFT 16 #define MAC_TRAFFIC_CLASS_ARRANGEMENT_MASK (0xf<<MAC_TRAFFIC_CLASS_ARRANGEMENT_SHIFT) #define MAC_TRAFFIC_CLASS_ARRANGEMENT(x) (((x)<<MAC_TRAFFIC_CLASS_ARRANGEMENT_SHIFT) & MAC_TRAFFIC_CLASS_ARRANGEMENT_MASK) + +/* Firmware < 1.007 */ #define LOCAL_CONFIG_LINK_STATUS_IRQ_EN (1<<24) #define LOCAL_CONFIG_CON_LO_IRQ_EN (1<<23) #define LOCAL_CONFIG_CON_HI_IRQ_EN (1<<22) @@ -101,6 +112,8 @@ struct netx_eth_priv { u32 msg_enable; struct xc *xc; spinlock_t lock; + + int xc_version; }; static void netx_eth_set_multicast_list(struct net_device *ndev) @@ -128,8 +141,8 @@ netx_eth_hard_start_xmit(struct sk_buff FIFO_PTR_FRAMELEN(len)); ndev->trans_start = jiffies; - dev->stats.tx_packets++; - dev->stats.tx_bytes += skb->len; + ndev->stats.tx_packets++; + ndev->stats.tx_bytes += skb->len; netif_stop_queue(ndev); spin_unlock_irq(&priv->lock); @@ -155,7 +168,7 @@ static void netx_eth_receive(struct net_ if (unlikely(skb == NULL)) { printk(KERN_NOTICE "%s: Low memory, packet dropped.\n", ndev->name); - dev->stats.rx_dropped++; + ndev->stats.rx_dropped++; return; } @@ -169,8 +182,8 @@ static void netx_eth_receive(struct net_ ndev->last_rx = jiffies; skb->protocol = eth_type_trans(skb, ndev); netif_rx(skb); - dev->stats.rx_packets++; - dev->stats.rx_bytes += len; + ndev->stats.rx_packets++; + ndev->stats.rx_bytes += len; } static irqreturn_t @@ -226,13 +239,23 @@ static int netx_eth_open(struct net_devi ndev->dev_addr[5]<<8, priv->xpec_base + NETX_XPEC_RAM_START_OFS + ETH_MAC_65); - writel(LOCAL_CONFIG_LINK_STATUS_IRQ_EN | - LOCAL_CONFIG_CON_LO_IRQ_EN | - LOCAL_CONFIG_CON_HI_IRQ_EN | - LOCAL_CONFIG_IND_LO_IRQ_EN | - LOCAL_CONFIG_IND_HI_IRQ_EN, - priv->xpec_base + NETX_XPEC_RAM_START_OFS + - ETH_MAC_LOCAL_CONFIG); + if (priv->xc_version >= 1007) { + writel(IRQ_ENABLE_LINK_STATUS | + IRQ_ENABLE_CON_LO | + IRQ_ENABLE_CON_HI | + IRQ_ENABLE_IND_LO | + IRQ_ENABLE_IND_HI, + priv->xpec_base + NETX_XPEC_RAM_START_OFS + + ETH_MAC_IRQ_ENABLE); + } else { + writel(LOCAL_CONFIG_LINK_STATUS_IRQ_EN | + LOCAL_CONFIG_CON_LO_IRQ_EN | + LOCAL_CONFIG_CON_HI_IRQ_EN | + LOCAL_CONFIG_IND_LO_IRQ_EN | + LOCAL_CONFIG_IND_HI_IRQ_EN, + priv->xpec_base + NETX_XPEC_RAM_START_OFS + + ETH_MAC_LOCAL_CONFIG); + } mii_check_media(&priv->mii, netif_msg_link(priv), 1); netif_start_queue(ndev); @@ -249,6 +272,9 @@ static int netx_eth_close(struct net_dev writel(0, priv->xpec_base + NETX_XPEC_RAM_START_OFS + ETH_MAC_LOCAL_CONFIG); + writel(0, + priv->xpec_base + NETX_XPEC_RAM_START_OFS + ETH_MAC_IRQ_ENABLE); + free_irq(ndev->irq, ndev); return 0; @@ -303,6 +329,30 @@ netx_eth_phy_write(struct net_device *nd while (readl(NETX_MIIMU) & MIIMU_SNRDY); } +static int netx_eth_get_xc_version(struct net_device *ndev) +{ + struct netx_eth_priv *priv = netdev_priv(ndev); + unsigned long val; + + val = readl(priv->xc->xmac_base + 0x48); + + switch (val) { + case 0x20c000c9: + priv->xc_version = 1006; + break; + case 0x0137fe41: + priv->xc_version = 1007; + break; + default: + printk(KERN_ERR "%s: could not determine firmware version: 0x%08lx\n", ndev->name, val); + return -1; + } + + printk(KERN_INFO "%s: found firmware version %d\n", ndev->name, priv->xc_version); + + return 0; +} + static int netx_eth_enable(struct net_device *ndev) { struct netx_eth_priv *priv = netdev_priv(ndev); @@ -335,6 +385,9 @@ static int netx_eth_enable(struct net_de * loaded the firmware for us */ if (running) { + if (netx_eth_get_xc_version(ndev)) + return -ENODEV; + /* get Node Address from hardware */ mac4321 = readl(priv->xpec_base + NETX_XPEC_RAM_START_OFS + ETH_MAC_4321); @@ -352,6 +405,8 @@ static int netx_eth_enable(struct net_de printk(CARDNAME ": requesting firmware failed\n"); return -ENODEV; } + if (netx_eth_get_xc_version(ndev)) + return -ENODEV; } xc_reset(priv->xc); - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html