Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/olof/pasemi
This commit is contained in:
commit
c7cd5b9807
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2007, PA Semi, Inc
|
* Copyright (C) 2005-2008, PA Semi, Inc
|
||||||
*
|
*
|
||||||
* Maintained by: Olof Johansson <olof@lixom.net>
|
* Maintained by: Olof Johansson <olof@lixom.net>
|
||||||
*
|
*
|
||||||
@ -27,7 +27,6 @@
|
|||||||
#include <asm/abs_addr.h>
|
#include <asm/abs_addr.h>
|
||||||
#include <asm/firmware.h>
|
#include <asm/firmware.h>
|
||||||
|
|
||||||
|
|
||||||
#define IOBMAP_PAGE_SHIFT 12
|
#define IOBMAP_PAGE_SHIFT 12
|
||||||
#define IOBMAP_PAGE_SIZE (1 << IOBMAP_PAGE_SHIFT)
|
#define IOBMAP_PAGE_SIZE (1 << IOBMAP_PAGE_SHIFT)
|
||||||
#define IOBMAP_PAGE_MASK (IOBMAP_PAGE_SIZE - 1)
|
#define IOBMAP_PAGE_MASK (IOBMAP_PAGE_SIZE - 1)
|
||||||
@ -35,13 +34,13 @@
|
|||||||
#define IOB_BASE 0xe0000000
|
#define IOB_BASE 0xe0000000
|
||||||
#define IOB_SIZE 0x3000
|
#define IOB_SIZE 0x3000
|
||||||
/* Configuration registers */
|
/* Configuration registers */
|
||||||
#define IOBCAP_REG 0x10
|
#define IOBCAP_REG 0x40
|
||||||
#define IOBCOM_REG 0x40
|
#define IOBCOM_REG 0x100
|
||||||
/* Enable IOB address translation */
|
/* Enable IOB address translation */
|
||||||
#define IOBCOM_ATEN 0x00000100
|
#define IOBCOM_ATEN 0x00000100
|
||||||
|
|
||||||
/* Address decode configuration register */
|
/* Address decode configuration register */
|
||||||
#define IOB_AD_REG 0x53
|
#define IOB_AD_REG 0x14c
|
||||||
/* IOBCOM_AD_REG fields */
|
/* IOBCOM_AD_REG fields */
|
||||||
#define IOB_AD_VGPRT 0x00000e00
|
#define IOB_AD_VGPRT 0x00000e00
|
||||||
#define IOB_AD_VGAEN 0x00000100
|
#define IOB_AD_VGAEN 0x00000100
|
||||||
@ -56,13 +55,13 @@
|
|||||||
#define IOB_AD_TRNG_2G 0x00000001
|
#define IOB_AD_TRNG_2G 0x00000001
|
||||||
#define IOB_AD_TRNG_128G 0x00000003
|
#define IOB_AD_TRNG_128G 0x00000003
|
||||||
|
|
||||||
#define IOB_TABLEBASE_REG 0x55
|
#define IOB_TABLEBASE_REG 0x154
|
||||||
|
|
||||||
/* Base of the 64 4-byte L1 registers */
|
/* Base of the 64 4-byte L1 registers */
|
||||||
#define IOB_XLT_L1_REGBASE 0xac0
|
#define IOB_XLT_L1_REGBASE 0x2b00
|
||||||
|
|
||||||
/* Register to invalidate TLB entries */
|
/* Register to invalidate TLB entries */
|
||||||
#define IOB_AT_INVAL_TLB_REG 0xb40
|
#define IOB_AT_INVAL_TLB_REG 0x2d00
|
||||||
|
|
||||||
/* The top two bits of the level 1 entry contains valid and type flags */
|
/* The top two bits of the level 1 entry contains valid and type flags */
|
||||||
#define IOBMAP_L1E_V 0x40000000
|
#define IOBMAP_L1E_V 0x40000000
|
||||||
@ -76,7 +75,7 @@
|
|||||||
#define IOBMAP_L2E_V 0x80000000
|
#define IOBMAP_L2E_V 0x80000000
|
||||||
#define IOBMAP_L2E_V_CACHED 0xc0000000
|
#define IOBMAP_L2E_V_CACHED 0xc0000000
|
||||||
|
|
||||||
static u32 __iomem *iob;
|
static void __iomem *iob;
|
||||||
static u32 iob_l1_emptyval;
|
static u32 iob_l1_emptyval;
|
||||||
static u32 iob_l2_emptyval;
|
static u32 iob_l2_emptyval;
|
||||||
static u32 *iob_l2_base;
|
static u32 *iob_l2_base;
|
||||||
@ -219,7 +218,7 @@ int __init iob_init(struct device_node *dn)
|
|||||||
for (i = 0; i < 64; i++) {
|
for (i = 0; i < 64; i++) {
|
||||||
/* Each L1 covers 32MB, i.e. 8K entries = 32K of ram */
|
/* Each L1 covers 32MB, i.e. 8K entries = 32K of ram */
|
||||||
regword = IOBMAP_L1E_V | (__pa(iob_l2_base + i*0x2000) >> 12);
|
regword = IOBMAP_L1E_V | (__pa(iob_l2_base + i*0x2000) >> 12);
|
||||||
out_le32(iob+IOB_XLT_L1_REGBASE+i, regword);
|
out_le32(iob+IOB_XLT_L1_REGBASE+i*4, regword);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set 2GB translation window, based at 0 */
|
/* set 2GB translation window, based at 0 */
|
||||||
|
@ -1410,11 +1410,6 @@ void mpic_cpu_set_priority(int prio)
|
|||||||
mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), prio);
|
mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX: someone who knows mpic should check this.
|
|
||||||
* do we need to eoi the ipi including for kexec cpu here (see xics comments)?
|
|
||||||
* or can we reset the mpic in the new kernel?
|
|
||||||
*/
|
|
||||||
void mpic_teardown_this_cpu(int secondary)
|
void mpic_teardown_this_cpu(int secondary)
|
||||||
{
|
{
|
||||||
struct mpic *mpic = mpic_primary;
|
struct mpic *mpic = mpic_primary;
|
||||||
@ -1434,6 +1429,10 @@ void mpic_teardown_this_cpu(int secondary)
|
|||||||
|
|
||||||
/* Set current processor priority to max */
|
/* Set current processor priority to max */
|
||||||
mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0xf);
|
mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0xf);
|
||||||
|
/* We need to EOI the IPI since not all platforms reset the MPIC
|
||||||
|
* on boot and new interrupts wouldn't get delivered otherwise.
|
||||||
|
*/
|
||||||
|
mpic_eoi(mpic);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&mpic_lock, flags);
|
spin_unlock_irqrestore(&mpic_lock, flags);
|
||||||
}
|
}
|
||||||
|
@ -404,6 +404,7 @@ static void pasemi_mac_free_csring(struct pasemi_mac_csring *csring)
|
|||||||
pasemi_dma_free_flag(csring->events[1]);
|
pasemi_dma_free_flag(csring->events[1]);
|
||||||
pasemi_dma_free_ring(&csring->chan);
|
pasemi_dma_free_ring(&csring->chan);
|
||||||
pasemi_dma_free_chan(&csring->chan);
|
pasemi_dma_free_chan(&csring->chan);
|
||||||
|
pasemi_dma_free_fun(csring->fun);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pasemi_mac_setup_rx_resources(const struct net_device *dev)
|
static int pasemi_mac_setup_rx_resources(const struct net_device *dev)
|
||||||
@ -1150,7 +1151,10 @@ static int pasemi_mac_open(struct net_device *dev)
|
|||||||
if (!mac->tx)
|
if (!mac->tx)
|
||||||
goto out_tx_ring;
|
goto out_tx_ring;
|
||||||
|
|
||||||
if (dev->mtu > 1500) {
|
/* We might already have allocated rings in case mtu was changed
|
||||||
|
* before interface was brought up.
|
||||||
|
*/
|
||||||
|
if (dev->mtu > 1500 && !mac->num_cs) {
|
||||||
pasemi_mac_setup_csrings(mac);
|
pasemi_mac_setup_csrings(mac);
|
||||||
if (!mac->num_cs)
|
if (!mac->num_cs)
|
||||||
goto out_tx_ring;
|
goto out_tx_ring;
|
||||||
@ -1388,8 +1392,12 @@ static int pasemi_mac_close(struct net_device *dev)
|
|||||||
free_irq(mac->tx->chan.irq, mac->tx);
|
free_irq(mac->tx->chan.irq, mac->tx);
|
||||||
free_irq(mac->rx->chan.irq, mac->rx);
|
free_irq(mac->rx->chan.irq, mac->rx);
|
||||||
|
|
||||||
for (i = 0; i < mac->num_cs; i++)
|
for (i = 0; i < mac->num_cs; i++) {
|
||||||
pasemi_mac_free_csring(mac->cs[i]);
|
pasemi_mac_free_csring(mac->cs[i]);
|
||||||
|
mac->cs[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mac->num_cs = 0;
|
||||||
|
|
||||||
/* Free resources */
|
/* Free resources */
|
||||||
pasemi_mac_free_rx_resources(mac);
|
pasemi_mac_free_rx_resources(mac);
|
||||||
@ -1640,6 +1648,26 @@ static int pasemi_mac_poll(struct napi_struct *napi, int budget)
|
|||||||
return pkts;
|
return pkts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
|
/*
|
||||||
|
* Polling 'interrupt' - used by things like netconsole to send skbs
|
||||||
|
* without having to re-enable interrupts. It's not called while
|
||||||
|
* the interrupt routine is executing.
|
||||||
|
*/
|
||||||
|
static void pasemi_mac_netpoll(struct net_device *dev)
|
||||||
|
{
|
||||||
|
const struct pasemi_mac *mac = netdev_priv(dev);
|
||||||
|
|
||||||
|
disable_irq(mac->tx->chan.irq);
|
||||||
|
pasemi_mac_tx_intr(mac->tx->chan.irq, mac->tx);
|
||||||
|
enable_irq(mac->tx->chan.irq);
|
||||||
|
|
||||||
|
disable_irq(mac->rx->chan.irq);
|
||||||
|
pasemi_mac_rx_intr(mac->rx->chan.irq, mac->rx);
|
||||||
|
enable_irq(mac->rx->chan.irq);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int pasemi_mac_change_mtu(struct net_device *dev, int new_mtu)
|
static int pasemi_mac_change_mtu(struct net_device *dev, int new_mtu)
|
||||||
{
|
{
|
||||||
struct pasemi_mac *mac = netdev_priv(dev);
|
struct pasemi_mac *mac = netdev_priv(dev);
|
||||||
@ -1799,6 +1827,9 @@ pasemi_mac_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
dev->mtu = PE_DEF_MTU;
|
dev->mtu = PE_DEF_MTU;
|
||||||
/* 1500 MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
|
/* 1500 MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
|
||||||
mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
|
mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
|
||||||
|
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||||
|
dev->poll_controller = pasemi_mac_netpoll;
|
||||||
|
#endif
|
||||||
|
|
||||||
dev->change_mtu = pasemi_mac_change_mtu;
|
dev->change_mtu = pasemi_mac_change_mtu;
|
||||||
dev->ethtool_ops = &pasemi_mac_ethtool_ops;
|
dev->ethtool_ops = &pasemi_mac_ethtool_ops;
|
||||||
|
Loading…
Reference in New Issue
Block a user