diff --git a/[refs] b/[refs]
index 28b8fd91c198..e0d099a73088 100644
--- a/[refs]
+++ b/[refs]
@@ -1,2 +1,2 @@
---
-refs/heads/master: 23946a8a980d13af7b84bcf3ce023e0d166ec83f
+refs/heads/master: 062caf43d803771b660defe6b147711d8b730364
diff --git a/trunk/.gitignore b/trunk/.gitignore
index b1f5b9df2ae1..27fd37621255 100644
--- a/trunk/.gitignore
+++ b/trunk/.gitignore
@@ -30,11 +30,6 @@ include/config
include/linux/autoconf.h
include/linux/compile.h
include/linux/version.h
-include/linux/utsrelease.h
# stgit generated dirs
patches-*
-
-# quilt's files
-patches
-series
diff --git a/trunk/Documentation/DocBook/kernel-api.tmpl b/trunk/Documentation/DocBook/kernel-api.tmpl
index f8fe882e33dc..1ae4dc0fd856 100644
--- a/trunk/Documentation/DocBook/kernel-api.tmpl
+++ b/trunk/Documentation/DocBook/kernel-api.tmpl
@@ -58,9 +58,6 @@
!Iinclude/linux/ktime.h
!Iinclude/linux/hrtimer.h
!Ekernel/hrtimer.c
-
- Workqueues and Kevents
-!Ekernel/workqueue.c
Internal Functions
!Ikernel/exit.c
@@ -303,7 +300,7 @@ X!Ekernel/module.c
Resources Management
-!Ikernel/resource.c
+!Ekernel/resource.c
MTRR Handling
@@ -315,7 +312,9 @@ X!Ekernel/module.c
!Edrivers/pci/pci-driver.c
!Edrivers/pci/remove.c
!Edrivers/pci/pci-acpi.c
-!Edrivers/pci/search.c
+
!Edrivers/pci/msi.c
!Edrivers/pci/bus.c
size-4096 slab */
@@ -3708,7 +3708,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
#define E1000_CB_LENGTH 256
if (length < E1000_CB_LENGTH) {
struct sk_buff *new_skb =
- netdev_alloc_skb(netdev, length + NET_IP_ALIGN);
+ dev_alloc_skb(length + NET_IP_ALIGN);
if (new_skb) {
skb_reserve(new_skb, NET_IP_ALIGN);
new_skb->dev = netdev;
@@ -3979,7 +3979,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
while (cleaned_count--) {
if (!(skb = buffer_info->skb))
- skb = netdev_alloc_skb(netdev, bufsz);
+ skb = dev_alloc_skb(bufsz);
else {
skb_trim(skb, 0);
goto map_skb;
@@ -3997,7 +3997,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes "
"at %p\n", bufsz, skb->data);
/* Try again, without freeing the previous */
- skb = netdev_alloc_skb(netdev, bufsz);
+ skb = dev_alloc_skb(bufsz);
/* Failed allocation, critical failure */
if (!skb) {
dev_kfree_skb(oldskb);
@@ -4121,8 +4121,7 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter,
rx_desc->read.buffer_addr[j+1] = ~0;
}
- skb = netdev_alloc_skb(netdev,
- adapter->rx_ps_bsize0 + NET_IP_ALIGN);
+ skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN);
if (unlikely(!skb)) {
adapter->alloc_rx_buff_failed++;
diff --git a/trunk/drivers/net/forcedeth.c b/trunk/drivers/net/forcedeth.c
index 6fc6d1b05f1e..11b8f1b43dd5 100644
--- a/trunk/drivers/net/forcedeth.c
+++ b/trunk/drivers/net/forcedeth.c
@@ -381,21 +381,21 @@ enum {
/* Big endian: should work, but is untested */
struct ring_desc {
- __le32 buf;
- __le32 flaglen;
+ u32 PacketBuffer;
+ u32 FlagLen;
};
struct ring_desc_ex {
- __le32 bufhigh;
- __le32 buflow;
- __le32 txvlan;
- __le32 flaglen;
+ u32 PacketBufferHigh;
+ u32 PacketBufferLow;
+ u32 TxVlan;
+ u32 FlagLen;
};
-union ring_type {
+typedef union _ring_type {
struct ring_desc* orig;
struct ring_desc_ex* ex;
-};
+} ring_type;
#define FLAG_MASK_V1 0xffff0000
#define FLAG_MASK_V2 0xffffc000
@@ -653,8 +653,8 @@ static const struct nv_ethtool_str nv_etests_str[] = {
};
struct register_test {
- __le32 reg;
- __le32 mask;
+ u32 reg;
+ u32 mask;
};
static const struct register_test nv_registers_test[] = {
@@ -713,7 +713,7 @@ struct fe_priv {
/* rx specific fields.
* Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
*/
- union ring_type rx_ring;
+ ring_type rx_ring;
unsigned int cur_rx, refill_rx;
struct sk_buff **rx_skbuff;
dma_addr_t *rx_dma;
@@ -733,7 +733,7 @@ struct fe_priv {
/*
* tx specific fields.
*/
- union ring_type tx_ring;
+ ring_type tx_ring;
unsigned int next_tx, nic_tx;
struct sk_buff **tx_skbuff;
dma_addr_t *tx_dma;
@@ -826,13 +826,13 @@ static inline void pci_push(u8 __iomem *base)
static inline u32 nv_descr_getlength(struct ring_desc *prd, u32 v)
{
- return le32_to_cpu(prd->flaglen)
+ return le32_to_cpu(prd->FlagLen)
& ((v == DESC_VER_1) ? LEN_MASK_V1 : LEN_MASK_V2);
}
static inline u32 nv_descr_getlength_ex(struct ring_desc_ex *prd, u32 v)
{
- return le32_to_cpu(prd->flaglen) & LEN_MASK_V2;
+ return le32_to_cpu(prd->FlagLen) & LEN_MASK_V2;
}
static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
@@ -885,7 +885,7 @@ static void free_rings(struct net_device *dev)
struct fe_priv *np = get_nvpriv(dev);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- if (np->rx_ring.orig)
+ if(np->rx_ring.orig)
pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (np->rx_ring_size + np->tx_ring_size),
np->rx_ring.orig, np->ring_addr);
} else {
@@ -1258,14 +1258,14 @@ static int nv_alloc_rx(struct net_device *dev)
np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data,
skb->end-skb->data, PCI_DMA_FROMDEVICE);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->rx_ring.orig[nr].buf = cpu_to_le32(np->rx_dma[nr]);
+ np->rx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]);
wmb();
- np->rx_ring.orig[nr].flaglen = cpu_to_le32(np->rx_buf_sz | NV_RX_AVAIL);
+ np->rx_ring.orig[nr].FlagLen = cpu_to_le32(np->rx_buf_sz | NV_RX_AVAIL);
} else {
- np->rx_ring.ex[nr].bufhigh = cpu_to_le64(np->rx_dma[nr]) >> 32;
- np->rx_ring.ex[nr].buflow = cpu_to_le64(np->rx_dma[nr]) & 0x0FFFFFFFF;
+ np->rx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->rx_dma[nr]) >> 32;
+ np->rx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->rx_dma[nr]) & 0x0FFFFFFFF;
wmb();
- np->rx_ring.ex[nr].flaglen = cpu_to_le32(np->rx_buf_sz | NV_RX2_AVAIL);
+ np->rx_ring.ex[nr].FlagLen = cpu_to_le32(np->rx_buf_sz | NV_RX2_AVAIL);
}
dprintk(KERN_DEBUG "%s: nv_alloc_rx: Packet %d marked as Available\n",
dev->name, refill_rx);
@@ -1315,9 +1315,9 @@ static void nv_init_rx(struct net_device *dev)
np->refill_rx = 0;
for (i = 0; i < np->rx_ring_size; i++)
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
- np->rx_ring.orig[i].flaglen = 0;
+ np->rx_ring.orig[i].FlagLen = 0;
else
- np->rx_ring.ex[i].flaglen = 0;
+ np->rx_ring.ex[i].FlagLen = 0;
}
static void nv_init_tx(struct net_device *dev)
@@ -1328,9 +1328,9 @@ static void nv_init_tx(struct net_device *dev)
np->next_tx = np->nic_tx = 0;
for (i = 0; i < np->tx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
- np->tx_ring.orig[i].flaglen = 0;
+ np->tx_ring.orig[i].FlagLen = 0;
else
- np->tx_ring.ex[i].flaglen = 0;
+ np->tx_ring.ex[i].FlagLen = 0;
np->tx_skbuff[i] = NULL;
np->tx_dma[i] = 0;
}
@@ -1373,9 +1373,9 @@ static void nv_drain_tx(struct net_device *dev)
for (i = 0; i < np->tx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
- np->tx_ring.orig[i].flaglen = 0;
+ np->tx_ring.orig[i].FlagLen = 0;
else
- np->tx_ring.ex[i].flaglen = 0;
+ np->tx_ring.ex[i].FlagLen = 0;
if (nv_release_txskb(dev, i))
np->stats.tx_dropped++;
}
@@ -1387,9 +1387,9 @@ static void nv_drain_rx(struct net_device *dev)
int i;
for (i = 0; i < np->rx_ring_size; i++) {
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
- np->rx_ring.orig[i].flaglen = 0;
+ np->rx_ring.orig[i].FlagLen = 0;
else
- np->rx_ring.ex[i].flaglen = 0;
+ np->rx_ring.ex[i].FlagLen = 0;
wmb();
if (np->rx_skbuff[i]) {
pci_unmap_single(np->pci_dev, np->rx_dma[i],
@@ -1450,17 +1450,17 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
np->tx_dma_len[nr] = bcnt;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->tx_ring.orig[nr].buf = cpu_to_le32(np->tx_dma[nr]);
- np->tx_ring.orig[nr].flaglen = cpu_to_le32((bcnt-1) | tx_flags);
+ np->tx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]);
+ np->tx_ring.orig[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags);
} else {
- np->tx_ring.ex[nr].bufhigh = cpu_to_le64(np->tx_dma[nr]) >> 32;
- np->tx_ring.ex[nr].buflow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF;
- np->tx_ring.ex[nr].flaglen = cpu_to_le32((bcnt-1) | tx_flags);
+ np->tx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->tx_dma[nr]) >> 32;
+ np->tx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF;
+ np->tx_ring.ex[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags);
}
tx_flags = np->tx_flags;
offset += bcnt;
size -= bcnt;
- } while (size);
+ } while(size);
/* setup the fragments */
for (i = 0; i < fragments; i++) {
@@ -1477,12 +1477,12 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
np->tx_dma_len[nr] = bcnt;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->tx_ring.orig[nr].buf = cpu_to_le32(np->tx_dma[nr]);
- np->tx_ring.orig[nr].flaglen = cpu_to_le32((bcnt-1) | tx_flags);
+ np->tx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]);
+ np->tx_ring.orig[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags);
} else {
- np->tx_ring.ex[nr].bufhigh = cpu_to_le64(np->tx_dma[nr]) >> 32;
- np->tx_ring.ex[nr].buflow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF;
- np->tx_ring.ex[nr].flaglen = cpu_to_le32((bcnt-1) | tx_flags);
+ np->tx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->tx_dma[nr]) >> 32;
+ np->tx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF;
+ np->tx_ring.ex[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags);
}
offset += bcnt;
size -= bcnt;
@@ -1491,9 +1491,9 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* set last fragment flag */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->tx_ring.orig[nr].flaglen |= cpu_to_le32(tx_flags_extra);
+ np->tx_ring.orig[nr].FlagLen |= cpu_to_le32(tx_flags_extra);
} else {
- np->tx_ring.ex[nr].flaglen |= cpu_to_le32(tx_flags_extra);
+ np->tx_ring.ex[nr].FlagLen |= cpu_to_le32(tx_flags_extra);
}
np->tx_skbuff[nr] = skb;
@@ -1512,10 +1512,10 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* set tx flags */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->tx_ring.orig[start_nr].flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
+ np->tx_ring.orig[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra);
} else {
- np->tx_ring.ex[start_nr].txvlan = cpu_to_le32(tx_flags_vlan);
- np->tx_ring.ex[start_nr].flaglen |= cpu_to_le32(tx_flags | tx_flags_extra);
+ np->tx_ring.ex[start_nr].TxVlan = cpu_to_le32(tx_flags_vlan);
+ np->tx_ring.ex[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra);
}
dprintk(KERN_DEBUG "%s: nv_start_xmit: packet %d (entries %d) queued for transmission. tx_flags_extra: %x\n",
@@ -1547,7 +1547,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
static void nv_tx_done(struct net_device *dev)
{
struct fe_priv *np = netdev_priv(dev);
- u32 flags;
+ u32 Flags;
unsigned int i;
struct sk_buff *skb;
@@ -1555,22 +1555,22 @@ static void nv_tx_done(struct net_device *dev)
i = np->nic_tx % np->tx_ring_size;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
- flags = le32_to_cpu(np->tx_ring.orig[i].flaglen);
+ Flags = le32_to_cpu(np->tx_ring.orig[i].FlagLen);
else
- flags = le32_to_cpu(np->tx_ring.ex[i].flaglen);
+ Flags = le32_to_cpu(np->tx_ring.ex[i].FlagLen);
- dprintk(KERN_DEBUG "%s: nv_tx_done: looking at packet %d, flags 0x%x.\n",
- dev->name, np->nic_tx, flags);
- if (flags & NV_TX_VALID)
+ dprintk(KERN_DEBUG "%s: nv_tx_done: looking at packet %d, Flags 0x%x.\n",
+ dev->name, np->nic_tx, Flags);
+ if (Flags & NV_TX_VALID)
break;
if (np->desc_ver == DESC_VER_1) {
- if (flags & NV_TX_LASTPACKET) {
+ if (Flags & NV_TX_LASTPACKET) {
skb = np->tx_skbuff[i];
- if (flags & (NV_TX_RETRYERROR|NV_TX_CARRIERLOST|NV_TX_LATECOLLISION|
+ if (Flags & (NV_TX_RETRYERROR|NV_TX_CARRIERLOST|NV_TX_LATECOLLISION|
NV_TX_UNDERFLOW|NV_TX_ERROR)) {
- if (flags & NV_TX_UNDERFLOW)
+ if (Flags & NV_TX_UNDERFLOW)
np->stats.tx_fifo_errors++;
- if (flags & NV_TX_CARRIERLOST)
+ if (Flags & NV_TX_CARRIERLOST)
np->stats.tx_carrier_errors++;
np->stats.tx_errors++;
} else {
@@ -1579,13 +1579,13 @@ static void nv_tx_done(struct net_device *dev)
}
}
} else {
- if (flags & NV_TX2_LASTPACKET) {
+ if (Flags & NV_TX2_LASTPACKET) {
skb = np->tx_skbuff[i];
- if (flags & (NV_TX2_RETRYERROR|NV_TX2_CARRIERLOST|NV_TX2_LATECOLLISION|
+ if (Flags & (NV_TX2_RETRYERROR|NV_TX2_CARRIERLOST|NV_TX2_LATECOLLISION|
NV_TX2_UNDERFLOW|NV_TX2_ERROR)) {
- if (flags & NV_TX2_UNDERFLOW)
+ if (Flags & NV_TX2_UNDERFLOW)
np->stats.tx_fifo_errors++;
- if (flags & NV_TX2_CARRIERLOST)
+ if (Flags & NV_TX2_CARRIERLOST)
np->stats.tx_carrier_errors++;
np->stats.tx_errors++;
} else {
@@ -1638,29 +1638,29 @@ static void nv_tx_timeout(struct net_device *dev)
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
printk(KERN_INFO "%03x: %08x %08x // %08x %08x // %08x %08x // %08x %08x\n",
i,
- le32_to_cpu(np->tx_ring.orig[i].buf),
- le32_to_cpu(np->tx_ring.orig[i].flaglen),
- le32_to_cpu(np->tx_ring.orig[i+1].buf),
- le32_to_cpu(np->tx_ring.orig[i+1].flaglen),
- le32_to_cpu(np->tx_ring.orig[i+2].buf),
- le32_to_cpu(np->tx_ring.orig[i+2].flaglen),
- le32_to_cpu(np->tx_ring.orig[i+3].buf),
- le32_to_cpu(np->tx_ring.orig[i+3].flaglen));
+ le32_to_cpu(np->tx_ring.orig[i].PacketBuffer),
+ le32_to_cpu(np->tx_ring.orig[i].FlagLen),
+ le32_to_cpu(np->tx_ring.orig[i+1].PacketBuffer),
+ le32_to_cpu(np->tx_ring.orig[i+1].FlagLen),
+ le32_to_cpu(np->tx_ring.orig[i+2].PacketBuffer),
+ le32_to_cpu(np->tx_ring.orig[i+2].FlagLen),
+ le32_to_cpu(np->tx_ring.orig[i+3].PacketBuffer),
+ le32_to_cpu(np->tx_ring.orig[i+3].FlagLen));
} else {
printk(KERN_INFO "%03x: %08x %08x %08x // %08x %08x %08x // %08x %08x %08x // %08x %08x %08x\n",
i,
- le32_to_cpu(np->tx_ring.ex[i].bufhigh),
- le32_to_cpu(np->tx_ring.ex[i].buflow),
- le32_to_cpu(np->tx_ring.ex[i].flaglen),
- le32_to_cpu(np->tx_ring.ex[i+1].bufhigh),
- le32_to_cpu(np->tx_ring.ex[i+1].buflow),
- le32_to_cpu(np->tx_ring.ex[i+1].flaglen),
- le32_to_cpu(np->tx_ring.ex[i+2].bufhigh),
- le32_to_cpu(np->tx_ring.ex[i+2].buflow),
- le32_to_cpu(np->tx_ring.ex[i+2].flaglen),
- le32_to_cpu(np->tx_ring.ex[i+3].bufhigh),
- le32_to_cpu(np->tx_ring.ex[i+3].buflow),
- le32_to_cpu(np->tx_ring.ex[i+3].flaglen));
+ le32_to_cpu(np->tx_ring.ex[i].PacketBufferHigh),
+ le32_to_cpu(np->tx_ring.ex[i].PacketBufferLow),
+ le32_to_cpu(np->tx_ring.ex[i].FlagLen),
+ le32_to_cpu(np->tx_ring.ex[i+1].PacketBufferHigh),
+ le32_to_cpu(np->tx_ring.ex[i+1].PacketBufferLow),
+ le32_to_cpu(np->tx_ring.ex[i+1].FlagLen),
+ le32_to_cpu(np->tx_ring.ex[i+2].PacketBufferHigh),
+ le32_to_cpu(np->tx_ring.ex[i+2].PacketBufferLow),
+ le32_to_cpu(np->tx_ring.ex[i+2].FlagLen),
+ le32_to_cpu(np->tx_ring.ex[i+3].PacketBufferHigh),
+ le32_to_cpu(np->tx_ring.ex[i+3].PacketBufferLow),
+ le32_to_cpu(np->tx_ring.ex[i+3].FlagLen));
}
}
}
@@ -1697,7 +1697,7 @@ static int nv_getlen(struct net_device *dev, void *packet, int datalen)
int protolen; /* length as stored in the proto field */
/* 1) calculate len according to header */
- if ( ((struct vlan_ethhdr *)packet)->h_vlan_proto == htons(ETH_P_8021Q)) {
+ if ( ((struct vlan_ethhdr *)packet)->h_vlan_proto == __constant_htons(ETH_P_8021Q)) {
protolen = ntohs( ((struct vlan_ethhdr *)packet)->h_vlan_encapsulated_proto );
hdrlen = VLAN_HLEN;
} else {
@@ -1743,7 +1743,7 @@ static int nv_getlen(struct net_device *dev, void *packet, int datalen)
static void nv_rx_process(struct net_device *dev)
{
struct fe_priv *np = netdev_priv(dev);
- u32 flags;
+ u32 Flags;
u32 vlanflags = 0;
for (;;) {
@@ -1755,18 +1755,18 @@ static void nv_rx_process(struct net_device *dev)
i = np->cur_rx % np->rx_ring_size;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- flags = le32_to_cpu(np->rx_ring.orig[i].flaglen);
+ Flags = le32_to_cpu(np->rx_ring.orig[i].FlagLen);
len = nv_descr_getlength(&np->rx_ring.orig[i], np->desc_ver);
} else {
- flags = le32_to_cpu(np->rx_ring.ex[i].flaglen);
+ Flags = le32_to_cpu(np->rx_ring.ex[i].FlagLen);
len = nv_descr_getlength_ex(&np->rx_ring.ex[i], np->desc_ver);
- vlanflags = le32_to_cpu(np->rx_ring.ex[i].buflow);
+ vlanflags = le32_to_cpu(np->rx_ring.ex[i].PacketBufferLow);
}
- dprintk(KERN_DEBUG "%s: nv_rx_process: looking at packet %d, flags 0x%x.\n",
- dev->name, np->cur_rx, flags);
+ dprintk(KERN_DEBUG "%s: nv_rx_process: looking at packet %d, Flags 0x%x.\n",
+ dev->name, np->cur_rx, Flags);
- if (flags & NV_RX_AVAIL)
+ if (Flags & NV_RX_AVAIL)
break; /* still owned by hardware, */
/*
@@ -1780,7 +1780,7 @@ static void nv_rx_process(struct net_device *dev)
{
int j;
- dprintk(KERN_DEBUG "Dumping packet (flags 0x%x).",flags);
+ dprintk(KERN_DEBUG "Dumping packet (flags 0x%x).",Flags);
for (j=0; j<64; j++) {
if ((j%16) == 0)
dprintk("\n%03x:", j);
@@ -1790,30 +1790,30 @@ static void nv_rx_process(struct net_device *dev)
}
/* look at what we actually got: */
if (np->desc_ver == DESC_VER_1) {
- if (!(flags & NV_RX_DESCRIPTORVALID))
+ if (!(Flags & NV_RX_DESCRIPTORVALID))
goto next_pkt;
- if (flags & NV_RX_ERROR) {
- if (flags & NV_RX_MISSEDFRAME) {
+ if (Flags & NV_RX_ERROR) {
+ if (Flags & NV_RX_MISSEDFRAME) {
np->stats.rx_missed_errors++;
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) {
+ if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) {
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX_CRCERR) {
+ if (Flags & NV_RX_CRCERR) {
np->stats.rx_crc_errors++;
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX_OVERFLOW) {
+ if (Flags & NV_RX_OVERFLOW) {
np->stats.rx_over_errors++;
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX_ERROR4) {
+ if (Flags & NV_RX_ERROR4) {
len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
if (len < 0) {
np->stats.rx_errors++;
@@ -1821,32 +1821,32 @@ static void nv_rx_process(struct net_device *dev)
}
}
/* framing errors are soft errors. */
- if (flags & NV_RX_FRAMINGERR) {
- if (flags & NV_RX_SUBSTRACT1) {
+ if (Flags & NV_RX_FRAMINGERR) {
+ if (Flags & NV_RX_SUBSTRACT1) {
len--;
}
}
}
} else {
- if (!(flags & NV_RX2_DESCRIPTORVALID))
+ if (!(Flags & NV_RX2_DESCRIPTORVALID))
goto next_pkt;
- if (flags & NV_RX2_ERROR) {
- if (flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
+ if (Flags & NV_RX2_ERROR) {
+ if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) {
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX2_CRCERR) {
+ if (Flags & NV_RX2_CRCERR) {
np->stats.rx_crc_errors++;
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX2_OVERFLOW) {
+ if (Flags & NV_RX2_OVERFLOW) {
np->stats.rx_over_errors++;
np->stats.rx_errors++;
goto next_pkt;
}
- if (flags & NV_RX2_ERROR4) {
+ if (Flags & NV_RX2_ERROR4) {
len = nv_getlen(dev, np->rx_skbuff[i]->data, len);
if (len < 0) {
np->stats.rx_errors++;
@@ -1854,17 +1854,17 @@ static void nv_rx_process(struct net_device *dev)
}
}
/* framing errors are soft errors */
- if (flags & NV_RX2_FRAMINGERR) {
- if (flags & NV_RX2_SUBSTRACT1) {
+ if (Flags & NV_RX2_FRAMINGERR) {
+ if (Flags & NV_RX2_SUBSTRACT1) {
len--;
}
}
}
if (np->txrxctl_bits & NVREG_TXRXCTL_RXCHECK) {
- flags &= NV_RX2_CHECKSUMMASK;
- if (flags == NV_RX2_CHECKSUMOK1 ||
- flags == NV_RX2_CHECKSUMOK2 ||
- flags == NV_RX2_CHECKSUMOK3) {
+ Flags &= NV_RX2_CHECKSUMMASK;
+ if (Flags == NV_RX2_CHECKSUMOK1 ||
+ Flags == NV_RX2_CHECKSUMOK2 ||
+ Flags == NV_RX2_CHECKSUMOK3) {
dprintk(KERN_DEBUG "%s: hw checksum hit!.\n", dev->name);
np->rx_skbuff[i]->ip_summed = CHECKSUM_UNNECESSARY;
} else {
@@ -1990,7 +1990,7 @@ static int nv_set_mac_address(struct net_device *dev, void *addr)
struct fe_priv *np = netdev_priv(dev);
struct sockaddr *macaddr = (struct sockaddr*)addr;
- if (!is_valid_ether_addr(macaddr->sa_data))
+ if(!is_valid_ether_addr(macaddr->sa_data))
return -EADDRNOTAVAIL;
/* synchronized against open : rtnl_lock() held by caller */
@@ -2283,20 +2283,20 @@ static int nv_update_linkspeed(struct net_device *dev)
lpa_pause = lpa & (LPA_PAUSE_CAP| LPA_PAUSE_ASYM);
switch (adv_pause) {
- case ADVERTISE_PAUSE_CAP:
+ case (ADVERTISE_PAUSE_CAP):
if (lpa_pause & LPA_PAUSE_CAP) {
pause_flags |= NV_PAUSEFRAME_RX_ENABLE;
if (np->pause_flags & NV_PAUSEFRAME_TX_REQ)
pause_flags |= NV_PAUSEFRAME_TX_ENABLE;
}
break;
- case ADVERTISE_PAUSE_ASYM:
+ case (ADVERTISE_PAUSE_ASYM):
if (lpa_pause == (LPA_PAUSE_CAP| LPA_PAUSE_ASYM))
{
pause_flags |= NV_PAUSEFRAME_TX_ENABLE;
}
break;
- case ADVERTISE_PAUSE_CAP| ADVERTISE_PAUSE_ASYM:
+ case (ADVERTISE_PAUSE_CAP| ADVERTISE_PAUSE_ASYM):
if (lpa_pause & LPA_PAUSE_CAP)
{
pause_flags |= NV_PAUSEFRAME_RX_ENABLE;
@@ -3245,7 +3245,7 @@ static int nv_set_ringparam(struct net_device *dev, struct ethtool_ringparam* ri
if (!rxtx_ring || !rx_skbuff || !rx_dma || !tx_skbuff || !tx_dma || !tx_dma_len) {
/* fall back to old rings */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- if (rxtx_ring)
+ if(rxtx_ring)
pci_free_consistent(np->pci_dev, sizeof(struct ring_desc) * (ring->rx_pending + ring->tx_pending),
rxtx_ring, ring_addr);
} else {
@@ -3481,7 +3481,7 @@ static int nv_get_stats_count(struct net_device *dev)
struct fe_priv *np = netdev_priv(dev);
if (np->driver_data & DEV_HAS_STATISTICS)
- return sizeof(struct nv_ethtool_stats)/sizeof(u64);
+ return (sizeof(struct nv_ethtool_stats)/sizeof(u64));
else
return 0;
}
@@ -3619,7 +3619,7 @@ static int nv_loopback_test(struct net_device *dev)
struct sk_buff *tx_skb, *rx_skb;
dma_addr_t test_dma_addr;
u32 tx_flags_extra = (np->desc_ver == DESC_VER_1 ? NV_TX_LASTPACKET : NV_TX2_LASTPACKET);
- u32 flags;
+ u32 Flags;
int len, i, pkt_len;
u8 *pkt_data;
u32 filter_flags = 0;
@@ -3663,12 +3663,12 @@ static int nv_loopback_test(struct net_device *dev)
tx_skb->end-tx_skb->data, PCI_DMA_FROMDEVICE);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- np->tx_ring.orig[0].buf = cpu_to_le32(test_dma_addr);
- np->tx_ring.orig[0].flaglen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra);
+ np->tx_ring.orig[0].PacketBuffer = cpu_to_le32(test_dma_addr);
+ np->tx_ring.orig[0].FlagLen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra);
} else {
- np->tx_ring.ex[0].bufhigh = cpu_to_le64(test_dma_addr) >> 32;
- np->tx_ring.ex[0].buflow = cpu_to_le64(test_dma_addr) & 0x0FFFFFFFF;
- np->tx_ring.ex[0].flaglen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra);
+ np->tx_ring.ex[0].PacketBufferHigh = cpu_to_le64(test_dma_addr) >> 32;
+ np->tx_ring.ex[0].PacketBufferLow = cpu_to_le64(test_dma_addr) & 0x0FFFFFFFF;
+ np->tx_ring.ex[0].FlagLen = cpu_to_le32((pkt_len-1) | np->tx_flags | tx_flags_extra);
}
writel(NVREG_TXRXCTL_KICK|np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
pci_push(get_hwbase(dev));
@@ -3677,21 +3677,21 @@ static int nv_loopback_test(struct net_device *dev)
/* check for rx of the packet */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
- flags = le32_to_cpu(np->rx_ring.orig[0].flaglen);
+ Flags = le32_to_cpu(np->rx_ring.orig[0].FlagLen);
len = nv_descr_getlength(&np->rx_ring.orig[0], np->desc_ver);
} else {
- flags = le32_to_cpu(np->rx_ring.ex[0].flaglen);
+ Flags = le32_to_cpu(np->rx_ring.ex[0].FlagLen);
len = nv_descr_getlength_ex(&np->rx_ring.ex[0], np->desc_ver);
}
- if (flags & NV_RX_AVAIL) {
+ if (Flags & NV_RX_AVAIL) {
ret = 0;
} else if (np->desc_ver == DESC_VER_1) {
- if (flags & NV_RX_ERROR)
+ if (Flags & NV_RX_ERROR)
ret = 0;
} else {
- if (flags & NV_RX2_ERROR) {
+ if (Flags & NV_RX2_ERROR) {
ret = 0;
}
}
diff --git a/trunk/drivers/net/myri10ge/myri10ge.c b/trunk/drivers/net/myri10ge/myri10ge.c
index c3e52c806b13..07ca9480a6fe 100644
--- a/trunk/drivers/net/myri10ge/myri10ge.c
+++ b/trunk/drivers/net/myri10ge/myri10ge.c
@@ -620,7 +620,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp)
return -ENXIO;
}
dev_info(&mgp->pdev->dev, "handoff confirmed\n");
- myri10ge_dummy_rdma(mgp, 1);
+ myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096);
return 0;
}
diff --git a/trunk/drivers/net/qla3xxx.c b/trunk/drivers/net/qla3xxx.c
deleted file mode 100644
index c729aeeb4696..000000000000
--- a/trunk/drivers/net/qla3xxx.c
+++ /dev/null
@@ -1,3537 +0,0 @@
-/*
- * QLogic QLA3xxx NIC HBA Driver
- * Copyright (c) 2003-2006 QLogic Corporation
- *
- * See LICENSE.qla3xxx for copyright and licensing details.
- */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "qla3xxx.h"
-
-#define DRV_NAME "qla3xxx"
-#define DRV_STRING "QLogic ISP3XXX Network Driver"
-#define DRV_VERSION "v2.02.00-k36"
-#define PFX DRV_NAME " "
-
-static const char ql3xxx_driver_name[] = DRV_NAME;
-static const char ql3xxx_driver_version[] = DRV_VERSION;
-
-MODULE_AUTHOR("QLogic Corporation");
-MODULE_DESCRIPTION("QLogic ISP3XXX Network Driver " DRV_VERSION " ");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(DRV_VERSION);
-
-static const u32 default_msg
- = NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK
- | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN;
-
-static int debug = -1; /* defaults above */
-module_param(debug, int, 0);
-MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
-
-static int msi;
-module_param(msi, int, 0);
-MODULE_PARM_DESC(msi, "Turn on Message Signaled Interrupts.");
-
-static struct pci_device_id ql3xxx_pci_tbl[] __devinitdata = {
- {PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, QL3022_DEVICE_ID)},
- /* required last entry */
- {0,}
-};
-
-MODULE_DEVICE_TABLE(pci, ql3xxx_pci_tbl);
-
-/*
- * Caller must take hw_lock.
- */
-static int ql_sem_spinlock(struct ql3_adapter *qdev,
- u32 sem_mask, u32 sem_bits)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- u32 value;
- unsigned int seconds = 3;
-
- do {
- writel((sem_mask | sem_bits),
- &port_regs->CommonRegs.semaphoreReg);
- value = readl(&port_regs->CommonRegs.semaphoreReg);
- if ((value & (sem_mask >> 16)) == sem_bits)
- return 0;
- ssleep(1);
- } while(--seconds);
- return -1;
-}
-
-static void ql_sem_unlock(struct ql3_adapter *qdev, u32 sem_mask)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- writel(sem_mask, &port_regs->CommonRegs.semaphoreReg);
- readl(&port_regs->CommonRegs.semaphoreReg);
-}
-
-static int ql_sem_lock(struct ql3_adapter *qdev, u32 sem_mask, u32 sem_bits)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- u32 value;
-
- writel((sem_mask | sem_bits), &port_regs->CommonRegs.semaphoreReg);
- value = readl(&port_regs->CommonRegs.semaphoreReg);
- return ((value & (sem_mask >> 16)) == sem_bits);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_wait_for_drvr_lock(struct ql3_adapter *qdev)
-{
- int i = 0;
-
- while (1) {
- if (!ql_sem_lock(qdev,
- QL_DRVR_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index)
- * 2) << 1)) {
- if (i < 10) {
- ssleep(1);
- i++;
- } else {
- printk(KERN_ERR PFX "%s: Timed out waiting for "
- "driver lock...\n",
- qdev->ndev->name);
- return 0;
- }
- } else {
- printk(KERN_DEBUG PFX
- "%s: driver lock acquired.\n",
- qdev->ndev->name);
- return 1;
- }
- }
-}
-
-static void ql_set_register_page(struct ql3_adapter *qdev, u32 page)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
-
- writel(((ISP_CONTROL_NP_MASK << 16) | page),
- &port_regs->CommonRegs.ispControlStatus);
- readl(&port_regs->CommonRegs.ispControlStatus);
- qdev->current_page = page;
-}
-
-static u32 ql_read_common_reg_l(struct ql3_adapter *qdev,
- u32 __iomem * reg)
-{
- u32 value;
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- value = readl(reg);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-
- return value;
-}
-
-static u32 ql_read_common_reg(struct ql3_adapter *qdev,
- u32 __iomem * reg)
-{
- return readl(reg);
-}
-
-static u32 ql_read_page0_reg_l(struct ql3_adapter *qdev, u32 __iomem *reg)
-{
- u32 value;
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
-
- if (qdev->current_page != 0)
- ql_set_register_page(qdev,0);
- value = readl(reg);
-
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return value;
-}
-
-static u32 ql_read_page0_reg(struct ql3_adapter *qdev, u32 __iomem *reg)
-{
- if (qdev->current_page != 0)
- ql_set_register_page(qdev,0);
- return readl(reg);
-}
-
-static void ql_write_common_reg_l(struct ql3_adapter *qdev,
- u32 * reg, u32 value)
-{
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- writel(value, (u32 *) reg);
- readl(reg);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return;
-}
-
-static void ql_write_common_reg(struct ql3_adapter *qdev,
- u32 * reg, u32 value)
-{
- writel(value, (u32 *) reg);
- readl(reg);
- return;
-}
-
-static void ql_write_page0_reg(struct ql3_adapter *qdev,
- u32 * reg, u32 value)
-{
- if (qdev->current_page != 0)
- ql_set_register_page(qdev,0);
- writel(value, (u32 *) reg);
- readl(reg);
- return;
-}
-
-/*
- * Caller holds hw_lock. Only called during init.
- */
-static void ql_write_page1_reg(struct ql3_adapter *qdev,
- u32 * reg, u32 value)
-{
- if (qdev->current_page != 1)
- ql_set_register_page(qdev,1);
- writel(value, (u32 *) reg);
- readl(reg);
- return;
-}
-
-/*
- * Caller holds hw_lock. Only called during init.
- */
-static void ql_write_page2_reg(struct ql3_adapter *qdev,
- u32 * reg, u32 value)
-{
- if (qdev->current_page != 2)
- ql_set_register_page(qdev,2);
- writel(value, (u32 *) reg);
- readl(reg);
- return;
-}
-
-static void ql_disable_interrupts(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
-
- ql_write_common_reg_l(qdev, &port_regs->CommonRegs.ispInterruptMaskReg,
- (ISP_IMR_ENABLE_INT << 16));
-
-}
-
-static void ql_enable_interrupts(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
-
- ql_write_common_reg_l(qdev, &port_regs->CommonRegs.ispInterruptMaskReg,
- ((0xff << 16) | ISP_IMR_ENABLE_INT));
-
-}
-
-static void ql_release_to_lrg_buf_free_list(struct ql3_adapter *qdev,
- struct ql_rcv_buf_cb *lrg_buf_cb)
-{
- u64 map;
- lrg_buf_cb->next = NULL;
-
- if (qdev->lrg_buf_free_tail == NULL) { /* The list is empty */
- qdev->lrg_buf_free_head = qdev->lrg_buf_free_tail = lrg_buf_cb;
- } else {
- qdev->lrg_buf_free_tail->next = lrg_buf_cb;
- qdev->lrg_buf_free_tail = lrg_buf_cb;
- }
-
- if (!lrg_buf_cb->skb) {
- lrg_buf_cb->skb = dev_alloc_skb(qdev->lrg_buffer_len);
- if (unlikely(!lrg_buf_cb->skb)) {
- printk(KERN_ERR PFX "%s: failed dev_alloc_skb().\n",
- qdev->ndev->name);
- qdev->lrg_buf_skb_check++;
- } else {
- /*
- * We save some space to copy the ethhdr from first
- * buffer
- */
- skb_reserve(lrg_buf_cb->skb, QL_HEADER_SPACE);
- map = pci_map_single(qdev->pdev,
- lrg_buf_cb->skb->data,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE,
- PCI_DMA_FROMDEVICE);
- lrg_buf_cb->buf_phy_addr_low =
- cpu_to_le32(LS_64BITS(map));
- lrg_buf_cb->buf_phy_addr_high =
- cpu_to_le32(MS_64BITS(map));
- pci_unmap_addr_set(lrg_buf_cb, mapaddr, map);
- pci_unmap_len_set(lrg_buf_cb, maplen,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE);
- }
- }
-
- qdev->lrg_buf_free_count++;
-}
-
-static struct ql_rcv_buf_cb *ql_get_from_lrg_buf_free_list(struct ql3_adapter
- *qdev)
-{
- struct ql_rcv_buf_cb *lrg_buf_cb;
-
- if ((lrg_buf_cb = qdev->lrg_buf_free_head) != NULL) {
- if ((qdev->lrg_buf_free_head = lrg_buf_cb->next) == NULL)
- qdev->lrg_buf_free_tail = NULL;
- qdev->lrg_buf_free_count--;
- }
-
- return lrg_buf_cb;
-}
-
-static u32 addrBits = EEPROM_NO_ADDR_BITS;
-static u32 dataBits = EEPROM_NO_DATA_BITS;
-
-static void fm93c56a_deselect(struct ql3_adapter *qdev);
-static void eeprom_readword(struct ql3_adapter *qdev, u32 eepromAddr,
- unsigned short *value);
-
-/*
- * Caller holds hw_lock.
- */
-static void fm93c56a_select(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- qdev->eeprom_cmd_data = AUBURN_EEPROM_CS_1;
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->eeprom_cmd_data);
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ((ISP_NVRAM_MASK << 16) | qdev->eeprom_cmd_data));
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void fm93c56a_cmd(struct ql3_adapter *qdev, u32 cmd, u32 eepromAddr)
-{
- int i;
- u32 mask;
- u32 dataBit;
- u32 previousBit;
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- /* Clock in a zero, then do the start bit */
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->eeprom_cmd_data |
- AUBURN_EEPROM_DO_1);
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | AUBURN_EEPROM_DO_1 |
- AUBURN_EEPROM_CLK_RISE);
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | AUBURN_EEPROM_DO_1 |
- AUBURN_EEPROM_CLK_FALL);
-
- mask = 1 << (FM93C56A_CMD_BITS - 1);
- /* Force the previous data bit to be different */
- previousBit = 0xffff;
- for (i = 0; i < FM93C56A_CMD_BITS; i++) {
- dataBit =
- (cmd & mask) ? AUBURN_EEPROM_DO_1 : AUBURN_EEPROM_DO_0;
- if (previousBit != dataBit) {
- /*
- * If the bit changed, then change the DO state to
- * match
- */
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit);
- previousBit = dataBit;
- }
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit |
- AUBURN_EEPROM_CLK_RISE);
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit |
- AUBURN_EEPROM_CLK_FALL);
- cmd = cmd << 1;
- }
-
- mask = 1 << (addrBits - 1);
- /* Force the previous data bit to be different */
- previousBit = 0xffff;
- for (i = 0; i < addrBits; i++) {
- dataBit =
- (eepromAddr & mask) ? AUBURN_EEPROM_DO_1 :
- AUBURN_EEPROM_DO_0;
- if (previousBit != dataBit) {
- /*
- * If the bit changed, then change the DO state to
- * match
- */
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit);
- previousBit = dataBit;
- }
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit |
- AUBURN_EEPROM_CLK_RISE);
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->
- eeprom_cmd_data | dataBit |
- AUBURN_EEPROM_CLK_FALL);
- eepromAddr = eepromAddr << 1;
- }
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void fm93c56a_deselect(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- qdev->eeprom_cmd_data = AUBURN_EEPROM_CS_0;
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->eeprom_cmd_data);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void fm93c56a_datain(struct ql3_adapter *qdev, unsigned short *value)
-{
- int i;
- u32 data = 0;
- u32 dataBit;
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- /* Read the data bits */
- /* The first bit is a dummy. Clock right over it. */
- for (i = 0; i < dataBits; i++) {
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->eeprom_cmd_data |
- AUBURN_EEPROM_CLK_RISE);
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg,
- ISP_NVRAM_MASK | qdev->eeprom_cmd_data |
- AUBURN_EEPROM_CLK_FALL);
- dataBit =
- (ql_read_common_reg
- (qdev,
- &port_regs->CommonRegs.
- serialPortInterfaceReg) & AUBURN_EEPROM_DI_1) ? 1 : 0;
- data = (data << 1) | dataBit;
- }
- *value = (u16) data;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void eeprom_readword(struct ql3_adapter *qdev,
- u32 eepromAddr, unsigned short *value)
-{
- fm93c56a_select(qdev);
- fm93c56a_cmd(qdev, (int)FM93C56A_READ, eepromAddr);
- fm93c56a_datain(qdev, value);
- fm93c56a_deselect(qdev);
-}
-
-static void ql_swap_mac_addr(u8 * macAddress)
-{
-#ifdef __BIG_ENDIAN
- u8 temp;
- temp = macAddress[0];
- macAddress[0] = macAddress[1];
- macAddress[1] = temp;
- temp = macAddress[2];
- macAddress[2] = macAddress[3];
- macAddress[3] = temp;
- temp = macAddress[4];
- macAddress[4] = macAddress[5];
- macAddress[5] = temp;
-#endif
-}
-
-static int ql_get_nvram_params(struct ql3_adapter *qdev)
-{
- u16 *pEEPROMData;
- u16 checksum = 0;
- u32 index;
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
-
- pEEPROMData = (u16 *) & qdev->nvram_data;
- qdev->eeprom_cmd_data = 0;
- if(ql_sem_spinlock(qdev, QL_NVRAM_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 10)) {
- printk(KERN_ERR PFX"%s: Failed ql_sem_spinlock().\n",
- __func__);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return -1;
- }
-
- for (index = 0; index < EEPROM_SIZE; index++) {
- eeprom_readword(qdev, index, pEEPROMData);
- checksum += *pEEPROMData;
- pEEPROMData++;
- }
- ql_sem_unlock(qdev, QL_NVRAM_SEM_MASK);
-
- if (checksum != 0) {
- printk(KERN_ERR PFX "%s: checksum should be zero, is %x!!\n",
- qdev->ndev->name, checksum);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return -1;
- }
-
- /*
- * We have a problem with endianness for the MAC addresses
- * and the two 8-bit values version, and numPorts. We
- * have to swap them on big endian systems.
- */
- ql_swap_mac_addr(qdev->nvram_data.funcCfg_fn0.macAddress);
- ql_swap_mac_addr(qdev->nvram_data.funcCfg_fn1.macAddress);
- ql_swap_mac_addr(qdev->nvram_data.funcCfg_fn2.macAddress);
- ql_swap_mac_addr(qdev->nvram_data.funcCfg_fn3.macAddress);
- pEEPROMData = (u16 *) & qdev->nvram_data.version;
- *pEEPROMData = le16_to_cpu(*pEEPROMData);
-
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return checksum;
-}
-
-static const u32 PHYAddr[2] = {
- PORT0_PHY_ADDRESS, PORT1_PHY_ADDRESS
-};
-
-static int ql_wait_for_mii_ready(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 temp;
- int count = 1000;
-
- while (count) {
- temp = ql_read_page0_reg(qdev, &port_regs->macMIIStatusReg);
- if (!(temp & MAC_MII_STATUS_BSY))
- return 0;
- udelay(10);
- count--;
- }
- return -1;
-}
-
-static void ql_mii_enable_scan_mode(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 scanControl;
-
- if (qdev->numPorts > 1) {
- /* Auto scan will cycle through multiple ports */
- scanControl = MAC_MII_CONTROL_AS | MAC_MII_CONTROL_SC;
- } else {
- scanControl = MAC_MII_CONTROL_SC;
- }
-
- /*
- * Scan register 1 of PHY/PETBI,
- * Set up to scan both devices
- * The autoscan starts from the first register, completes
- * the last one before rolling over to the first
- */
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- PHYAddr[0] | MII_SCAN_REGISTER);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- (scanControl) |
- ((MAC_MII_CONTROL_SC | MAC_MII_CONTROL_AS) << 16));
-}
-
-static u8 ql_mii_disable_scan_mode(struct ql3_adapter *qdev)
-{
- u8 ret;
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- /* See if scan mode is enabled before we turn it off */
- if (ql_read_page0_reg(qdev, &port_regs->macMIIMgmtControlReg) &
- (MAC_MII_CONTROL_AS | MAC_MII_CONTROL_SC)) {
- /* Scan is enabled */
- ret = 1;
- } else {
- /* Scan is disabled */
- ret = 0;
- }
-
- /*
- * When disabling scan mode you must first change the MII register
- * address
- */
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- PHYAddr[0] | MII_SCAN_REGISTER);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- ((MAC_MII_CONTROL_SC | MAC_MII_CONTROL_AS |
- MAC_MII_CONTROL_RC) << 16));
-
- return ret;
-}
-
-static int ql_mii_write_reg_ex(struct ql3_adapter *qdev,
- u16 regAddr, u16 value, u32 mac_index)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u8 scanWasEnabled;
-
- scanWasEnabled = ql_mii_disable_scan_mode(qdev);
-
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- PHYAddr[mac_index] | regAddr);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtDataReg, value);
-
- /* Wait for write to complete 9/10/04 SJP */
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to"
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- if (scanWasEnabled)
- ql_mii_enable_scan_mode(qdev);
-
- return 0;
-}
-
-static int ql_mii_read_reg_ex(struct ql3_adapter *qdev, u16 regAddr,
- u16 * value, u32 mac_index)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u8 scanWasEnabled;
- u32 temp;
-
- scanWasEnabled = ql_mii_disable_scan_mode(qdev);
-
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- PHYAddr[mac_index] | regAddr);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- (MAC_MII_CONTROL_RC << 16));
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- (MAC_MII_CONTROL_RC << 16) | MAC_MII_CONTROL_RC);
-
- /* Wait for the read to complete */
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free after issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- temp = ql_read_page0_reg(qdev, &port_regs->macMIIMgmtDataReg);
- *value = (u16) temp;
-
- if (scanWasEnabled)
- ql_mii_enable_scan_mode(qdev);
-
- return 0;
-}
-
-static int ql_mii_write_reg(struct ql3_adapter *qdev, u16 regAddr, u16 value)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- ql_mii_disable_scan_mode(qdev);
-
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- qdev->PHYAddr | regAddr);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtDataReg, value);
-
- /* Wait for write to complete. */
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- ql_mii_enable_scan_mode(qdev);
-
- return 0;
-}
-
-static int ql_mii_read_reg(struct ql3_adapter *qdev, u16 regAddr, u16 *value)
-{
- u32 temp;
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- ql_mii_disable_scan_mode(qdev);
-
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtAddrReg,
- qdev->PHYAddr | regAddr);
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- (MAC_MII_CONTROL_RC << 16));
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- (MAC_MII_CONTROL_RC << 16) | MAC_MII_CONTROL_RC);
-
- /* Wait for the read to complete */
- if (ql_wait_for_mii_ready(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Timed out waiting for management port to "
- "get free before issuing command.\n",
- qdev->ndev->name);
- return -1;
- }
-
- temp = ql_read_page0_reg(qdev, &port_regs->macMIIMgmtDataReg);
- *value = (u16) temp;
-
- ql_mii_enable_scan_mode(qdev);
-
- return 0;
-}
-
-static void ql_petbi_reset(struct ql3_adapter *qdev)
-{
- ql_mii_write_reg(qdev, PETBI_CONTROL_REG, PETBI_CTRL_SOFT_RESET);
-}
-
-static void ql_petbi_start_neg(struct ql3_adapter *qdev)
-{
- u16 reg;
-
- /* Enable Auto-negotiation sense */
- ql_mii_read_reg(qdev, PETBI_TBI_CTRL, ®);
- reg |= PETBI_TBI_AUTO_SENSE;
- ql_mii_write_reg(qdev, PETBI_TBI_CTRL, reg);
-
- ql_mii_write_reg(qdev, PETBI_NEG_ADVER,
- PETBI_NEG_PAUSE | PETBI_NEG_DUPLEX);
-
- ql_mii_write_reg(qdev, PETBI_CONTROL_REG,
- PETBI_CTRL_AUTO_NEG | PETBI_CTRL_RESTART_NEG |
- PETBI_CTRL_FULL_DUPLEX | PETBI_CTRL_SPEED_1000);
-
-}
-
-static void ql_petbi_reset_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- ql_mii_write_reg_ex(qdev, PETBI_CONTROL_REG, PETBI_CTRL_SOFT_RESET,
- mac_index);
-}
-
-static void ql_petbi_start_neg_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- u16 reg;
-
- /* Enable Auto-negotiation sense */
- ql_mii_read_reg_ex(qdev, PETBI_TBI_CTRL, ®, mac_index);
- reg |= PETBI_TBI_AUTO_SENSE;
- ql_mii_write_reg_ex(qdev, PETBI_TBI_CTRL, reg, mac_index);
-
- ql_mii_write_reg_ex(qdev, PETBI_NEG_ADVER,
- PETBI_NEG_PAUSE | PETBI_NEG_DUPLEX, mac_index);
-
- ql_mii_write_reg_ex(qdev, PETBI_CONTROL_REG,
- PETBI_CTRL_AUTO_NEG | PETBI_CTRL_RESTART_NEG |
- PETBI_CTRL_FULL_DUPLEX | PETBI_CTRL_SPEED_1000,
- mac_index);
-}
-
-static void ql_petbi_init(struct ql3_adapter *qdev)
-{
- ql_petbi_reset(qdev);
- ql_petbi_start_neg(qdev);
-}
-
-static void ql_petbi_init_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- ql_petbi_reset_ex(qdev, mac_index);
- ql_petbi_start_neg_ex(qdev, mac_index);
-}
-
-static int ql_is_petbi_neg_pause(struct ql3_adapter *qdev)
-{
- u16 reg;
-
- if (ql_mii_read_reg(qdev, PETBI_NEG_PARTNER, ®) < 0)
- return 0;
-
- return (reg & PETBI_NEG_PAUSE_MASK) == PETBI_NEG_PAUSE;
-}
-
-static int ql_phy_get_speed(struct ql3_adapter *qdev)
-{
- u16 reg;
-
- if (ql_mii_read_reg(qdev, AUX_CONTROL_STATUS, ®) < 0)
- return 0;
-
- reg = (((reg & 0x18) >> 3) & 3);
-
- if (reg == 2)
- return SPEED_1000;
- else if (reg == 1)
- return SPEED_100;
- else if (reg == 0)
- return SPEED_10;
- else
- return -1;
-}
-
-static int ql_is_full_dup(struct ql3_adapter *qdev)
-{
- u16 reg;
-
- if (ql_mii_read_reg(qdev, AUX_CONTROL_STATUS, ®) < 0)
- return 0;
-
- return (reg & PHY_AUX_DUPLEX_STAT) != 0;
-}
-
-static int ql_is_phy_neg_pause(struct ql3_adapter *qdev)
-{
- u16 reg;
-
- if (ql_mii_read_reg(qdev, PHY_NEG_PARTNER, ®) < 0)
- return 0;
-
- return (reg & PHY_NEG_PAUSE) != 0;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_mac_enable(struct ql3_adapter *qdev, u32 enable)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 value;
-
- if (enable)
- value = (MAC_CONFIG_REG_PE | (MAC_CONFIG_REG_PE << 16));
- else
- value = (MAC_CONFIG_REG_PE << 16);
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev, &port_regs->mac1ConfigReg, value);
- else
- ql_write_page0_reg(qdev, &port_regs->mac0ConfigReg, value);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_mac_cfg_soft_reset(struct ql3_adapter *qdev, u32 enable)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 value;
-
- if (enable)
- value = (MAC_CONFIG_REG_SR | (MAC_CONFIG_REG_SR << 16));
- else
- value = (MAC_CONFIG_REG_SR << 16);
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev, &port_regs->mac1ConfigReg, value);
- else
- ql_write_page0_reg(qdev, &port_regs->mac0ConfigReg, value);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_mac_cfg_gig(struct ql3_adapter *qdev, u32 enable)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 value;
-
- if (enable)
- value = (MAC_CONFIG_REG_GM | (MAC_CONFIG_REG_GM << 16));
- else
- value = (MAC_CONFIG_REG_GM << 16);
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev, &port_regs->mac1ConfigReg, value);
- else
- ql_write_page0_reg(qdev, &port_regs->mac0ConfigReg, value);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_mac_cfg_full_dup(struct ql3_adapter *qdev, u32 enable)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 value;
-
- if (enable)
- value = (MAC_CONFIG_REG_FD | (MAC_CONFIG_REG_FD << 16));
- else
- value = (MAC_CONFIG_REG_FD << 16);
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev, &port_regs->mac1ConfigReg, value);
- else
- ql_write_page0_reg(qdev, &port_regs->mac0ConfigReg, value);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_mac_cfg_pause(struct ql3_adapter *qdev, u32 enable)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 value;
-
- if (enable)
- value =
- ((MAC_CONFIG_REG_TF | MAC_CONFIG_REG_RF) |
- ((MAC_CONFIG_REG_TF | MAC_CONFIG_REG_RF) << 16));
- else
- value = ((MAC_CONFIG_REG_TF | MAC_CONFIG_REG_RF) << 16);
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev, &port_regs->mac1ConfigReg, value);
- else
- ql_write_page0_reg(qdev, &port_regs->mac0ConfigReg, value);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_is_fiber(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp;
-
- switch (qdev->mac_index) {
- case 0:
- bitToCheck = PORT_STATUS_SM0;
- break;
- case 1:
- bitToCheck = PORT_STATUS_SM1;
- break;
- }
-
- temp = ql_read_page0_reg(qdev, &port_regs->portStatus);
- return (temp & bitToCheck) != 0;
-}
-
-static int ql_is_auto_cfg(struct ql3_adapter *qdev)
-{
- u16 reg;
- ql_mii_read_reg(qdev, 0x00, ®);
- return (reg & 0x1000) != 0;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_is_auto_neg_complete(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp;
-
- switch (qdev->mac_index) {
- case 0:
- bitToCheck = PORT_STATUS_AC0;
- break;
- case 1:
- bitToCheck = PORT_STATUS_AC1;
- break;
- }
-
- temp = ql_read_page0_reg(qdev, &port_regs->portStatus);
- if (temp & bitToCheck) {
- if (netif_msg_link(qdev))
- printk(KERN_INFO PFX
- "%s: Auto-Negotiate complete.\n",
- qdev->ndev->name);
- return 1;
- } else {
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Auto-Negotiate incomplete.\n",
- qdev->ndev->name);
- return 0;
- }
-}
-
-/*
- * ql_is_neg_pause() returns 1 if pause was negotiated to be on
- */
-static int ql_is_neg_pause(struct ql3_adapter *qdev)
-{
- if (ql_is_fiber(qdev))
- return ql_is_petbi_neg_pause(qdev);
- else
- return ql_is_phy_neg_pause(qdev);
-}
-
-static int ql_auto_neg_error(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp;
-
- switch (qdev->mac_index) {
- case 0:
- bitToCheck = PORT_STATUS_AE0;
- break;
- case 1:
- bitToCheck = PORT_STATUS_AE1;
- break;
- }
- temp = ql_read_page0_reg(qdev, &port_regs->portStatus);
- return (temp & bitToCheck) != 0;
-}
-
-static u32 ql_get_link_speed(struct ql3_adapter *qdev)
-{
- if (ql_is_fiber(qdev))
- return SPEED_1000;
- else
- return ql_phy_get_speed(qdev);
-}
-
-static int ql_is_link_full_dup(struct ql3_adapter *qdev)
-{
- if (ql_is_fiber(qdev))
- return 1;
- else
- return ql_is_full_dup(qdev);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_link_down_detect(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp;
-
- switch (qdev->mac_index) {
- case 0:
- bitToCheck = ISP_CONTROL_LINK_DN_0;
- break;
- case 1:
- bitToCheck = ISP_CONTROL_LINK_DN_1;
- break;
- }
-
- temp =
- ql_read_common_reg(qdev, &port_regs->CommonRegs.ispControlStatus);
- return (temp & bitToCheck) != 0;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_link_down_detect_clear(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- switch (qdev->mac_index) {
- case 0:
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.ispControlStatus,
- (ISP_CONTROL_LINK_DN_0) |
- (ISP_CONTROL_LINK_DN_0 << 16));
- break;
-
- case 1:
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.ispControlStatus,
- (ISP_CONTROL_LINK_DN_1) |
- (ISP_CONTROL_LINK_DN_1 << 16));
- break;
-
- default:
- return 1;
- }
-
- return 0;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_this_adapter_controls_port(struct ql3_adapter *qdev,
- u32 mac_index)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp;
-
- switch (mac_index) {
- case 0:
- bitToCheck = PORT_STATUS_F1_ENABLED;
- break;
- case 1:
- bitToCheck = PORT_STATUS_F3_ENABLED;
- break;
- default:
- break;
- }
-
- temp = ql_read_page0_reg(qdev, &port_regs->portStatus);
- if (temp & bitToCheck) {
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: is not link master.\n", qdev->ndev->name);
- return 0;
- } else {
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: is link master.\n", qdev->ndev->name);
- return 1;
- }
-}
-
-static void ql_phy_reset_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- ql_mii_write_reg_ex(qdev, CONTROL_REG, PHY_CTRL_SOFT_RESET, mac_index);
-}
-
-static void ql_phy_start_neg_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- u16 reg;
-
- ql_mii_write_reg_ex(qdev, PHY_NEG_ADVER,
- PHY_NEG_PAUSE | PHY_NEG_ADV_SPEED | 1, mac_index);
-
- ql_mii_read_reg_ex(qdev, CONTROL_REG, ®, mac_index);
- ql_mii_write_reg_ex(qdev, CONTROL_REG, reg | PHY_CTRL_RESTART_NEG,
- mac_index);
-}
-
-static void ql_phy_init_ex(struct ql3_adapter *qdev, u32 mac_index)
-{
- ql_phy_reset_ex(qdev, mac_index);
- ql_phy_start_neg_ex(qdev, mac_index);
-}
-
-/*
- * Caller holds hw_lock.
- */
-static u32 ql_get_link_state(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- u32 bitToCheck = 0;
- u32 temp, linkState;
-
- switch (qdev->mac_index) {
- case 0:
- bitToCheck = PORT_STATUS_UP0;
- break;
- case 1:
- bitToCheck = PORT_STATUS_UP1;
- break;
- }
- temp = ql_read_page0_reg(qdev, &port_regs->portStatus);
- if (temp & bitToCheck) {
- linkState = LS_UP;
- } else {
- linkState = LS_DOWN;
- if (netif_msg_link(qdev))
- printk(KERN_WARNING PFX
- "%s: Link is down.\n", qdev->ndev->name);
- }
- return linkState;
-}
-
-static int ql_port_start(struct ql3_adapter *qdev)
-{
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return -1;
-
- if (ql_is_fiber(qdev)) {
- ql_petbi_init(qdev);
- } else {
- /* Copper port */
- ql_phy_init_ex(qdev, qdev->mac_index);
- }
-
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- return 0;
-}
-
-static int ql_finish_auto_neg(struct ql3_adapter *qdev)
-{
-
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return -1;
-
- if (!ql_auto_neg_error(qdev)) {
- if (test_bit(QL_LINK_MASTER,&qdev->flags)) {
- /* configure the MAC */
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: Configuring link.\n",
- qdev->ndev->
- name);
- ql_mac_cfg_soft_reset(qdev, 1);
- ql_mac_cfg_gig(qdev,
- (ql_get_link_speed
- (qdev) ==
- SPEED_1000));
- ql_mac_cfg_full_dup(qdev,
- ql_is_link_full_dup
- (qdev));
- ql_mac_cfg_pause(qdev,
- ql_is_neg_pause
- (qdev));
- ql_mac_cfg_soft_reset(qdev, 0);
-
- /* enable the MAC */
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: Enabling mac.\n",
- qdev->ndev->
- name);
- ql_mac_enable(qdev, 1);
- }
-
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: Change port_link_state LS_DOWN to LS_UP.\n",
- qdev->ndev->name);
- qdev->port_link_state = LS_UP;
- netif_start_queue(qdev->ndev);
- netif_carrier_on(qdev->ndev);
- if (netif_msg_link(qdev))
- printk(KERN_INFO PFX
- "%s: Link is up at %d Mbps, %s duplex.\n",
- qdev->ndev->name,
- ql_get_link_speed(qdev),
- ql_is_link_full_dup(qdev)
- ? "full" : "half");
-
- } else { /* Remote error detected */
-
- if (test_bit(QL_LINK_MASTER,&qdev->flags)) {
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: Remote error detected. "
- "Calling ql_port_start().\n",
- qdev->ndev->
- name);
- /*
- * ql_port_start() is shared code and needs
- * to lock the PHY on it's own.
- */
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- if(ql_port_start(qdev)) {/* Restart port */
- return -1;
- } else
- return 0;
- }
- }
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- return 0;
-}
-
-static void ql_link_state_machine(struct ql3_adapter *qdev)
-{
- u32 curr_link_state;
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
-
- curr_link_state = ql_get_link_state(qdev);
-
- if (test_bit(QL_RESET_ACTIVE,&qdev->flags)) {
- if (netif_msg_link(qdev))
- printk(KERN_INFO PFX
- "%s: Reset in progress, skip processing link "
- "state.\n", qdev->ndev->name);
- return;
- }
-
- switch (qdev->port_link_state) {
- default:
- if (test_bit(QL_LINK_MASTER,&qdev->flags)) {
- ql_port_start(qdev);
- }
- qdev->port_link_state = LS_DOWN;
- /* Fall Through */
-
- case LS_DOWN:
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: port_link_state = LS_DOWN.\n",
- qdev->ndev->name);
- if (curr_link_state == LS_UP) {
- if (netif_msg_link(qdev))
- printk(KERN_DEBUG PFX
- "%s: curr_link_state = LS_UP.\n",
- qdev->ndev->name);
- if (ql_is_auto_neg_complete(qdev))
- ql_finish_auto_neg(qdev);
-
- if (qdev->port_link_state == LS_UP)
- ql_link_down_detect_clear(qdev);
-
- }
- break;
-
- case LS_UP:
- /*
- * See if the link is currently down or went down and came
- * back up
- */
- if ((curr_link_state == LS_DOWN) || ql_link_down_detect(qdev)) {
- if (netif_msg_link(qdev))
- printk(KERN_INFO PFX "%s: Link is down.\n",
- qdev->ndev->name);
- qdev->port_link_state = LS_DOWN;
- }
- break;
- }
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-}
-
-/*
- * Caller must take hw_lock and QL_PHY_GIO_SEM.
- */
-static void ql_get_phy_owner(struct ql3_adapter *qdev)
-{
- if (ql_this_adapter_controls_port(qdev, qdev->mac_index))
- set_bit(QL_LINK_MASTER,&qdev->flags);
- else
- clear_bit(QL_LINK_MASTER,&qdev->flags);
-}
-
-/*
- * Caller must take hw_lock and QL_PHY_GIO_SEM.
- */
-static void ql_init_scan_mode(struct ql3_adapter *qdev)
-{
- ql_mii_enable_scan_mode(qdev);
-
- if (test_bit(QL_LINK_OPTICAL,&qdev->flags)) {
- if (ql_this_adapter_controls_port(qdev, qdev->mac_index))
- ql_petbi_init_ex(qdev, qdev->mac_index);
- } else {
- if (ql_this_adapter_controls_port(qdev, qdev->mac_index))
- ql_phy_init_ex(qdev, qdev->mac_index);
- }
-}
-
-/*
- * MII_Setup needs to be called before taking the PHY out of reset so that the
- * management interface clock speed can be set properly. It would be better if
- * we had a way to disable MDC until after the PHY is out of reset, but we
- * don't have that capability.
- */
-static int ql_mii_setup(struct ql3_adapter *qdev)
-{
- u32 reg;
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
-
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return -1;
-
- /* Divide 125MHz clock by 28 to meet PHY timing requirements */
- reg = MAC_MII_CONTROL_CLK_SEL_DIV28;
-
- ql_write_page0_reg(qdev, &port_regs->macMIIMgmtControlReg,
- reg | ((MAC_MII_CONTROL_CLK_SEL_MASK) << 16));
-
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- return 0;
-}
-
-static u32 ql_supported_modes(struct ql3_adapter *qdev)
-{
- u32 supported;
-
- if (test_bit(QL_LINK_OPTICAL,&qdev->flags)) {
- supported = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE
- | SUPPORTED_Autoneg;
- } else {
- supported = SUPPORTED_10baseT_Half
- | SUPPORTED_10baseT_Full
- | SUPPORTED_100baseT_Half
- | SUPPORTED_100baseT_Full
- | SUPPORTED_1000baseT_Half
- | SUPPORTED_1000baseT_Full
- | SUPPORTED_Autoneg | SUPPORTED_TP;
- }
-
- return supported;
-}
-
-static int ql_get_auto_cfg_status(struct ql3_adapter *qdev)
-{
- int status;
- unsigned long hw_flags;
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return 0;
- status = ql_is_auto_cfg(qdev);
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return status;
-}
-
-static u32 ql_get_speed(struct ql3_adapter *qdev)
-{
- u32 status;
- unsigned long hw_flags;
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return 0;
- status = ql_get_link_speed(qdev);
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return status;
-}
-
-static int ql_get_full_dup(struct ql3_adapter *qdev)
-{
- int status;
- unsigned long hw_flags;
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7))
- return 0;
- status = ql_is_link_full_dup(qdev);
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- return status;
-}
-
-
-static int ql_get_settings(struct net_device *ndev, struct ethtool_cmd *ecmd)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
-
- ecmd->transceiver = XCVR_INTERNAL;
- ecmd->supported = ql_supported_modes(qdev);
-
- if (test_bit(QL_LINK_OPTICAL,&qdev->flags)) {
- ecmd->port = PORT_FIBRE;
- } else {
- ecmd->port = PORT_TP;
- ecmd->phy_address = qdev->PHYAddr;
- }
- ecmd->advertising = ql_supported_modes(qdev);
- ecmd->autoneg = ql_get_auto_cfg_status(qdev);
- ecmd->speed = ql_get_speed(qdev);
- ecmd->duplex = ql_get_full_dup(qdev);
- return 0;
-}
-
-static void ql_get_drvinfo(struct net_device *ndev,
- struct ethtool_drvinfo *drvinfo)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- strncpy(drvinfo->driver, ql3xxx_driver_name, 32);
- strncpy(drvinfo->version, ql3xxx_driver_version, 32);
- strncpy(drvinfo->fw_version, "N/A", 32);
- strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32);
- drvinfo->n_stats = 0;
- drvinfo->testinfo_len = 0;
- drvinfo->regdump_len = 0;
- drvinfo->eedump_len = 0;
-}
-
-static u32 ql_get_msglevel(struct net_device *ndev)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- return qdev->msg_enable;
-}
-
-static void ql_set_msglevel(struct net_device *ndev, u32 value)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- qdev->msg_enable = value;
-}
-
-static struct ethtool_ops ql3xxx_ethtool_ops = {
- .get_settings = ql_get_settings,
- .get_drvinfo = ql_get_drvinfo,
- .get_perm_addr = ethtool_op_get_perm_addr,
- .get_link = ethtool_op_get_link,
- .get_msglevel = ql_get_msglevel,
- .set_msglevel = ql_set_msglevel,
-};
-
-static int ql_populate_free_queue(struct ql3_adapter *qdev)
-{
- struct ql_rcv_buf_cb *lrg_buf_cb = qdev->lrg_buf_free_head;
- u64 map;
-
- while (lrg_buf_cb) {
- if (!lrg_buf_cb->skb) {
- lrg_buf_cb->skb = dev_alloc_skb(qdev->lrg_buffer_len);
- if (unlikely(!lrg_buf_cb->skb)) {
- printk(KERN_DEBUG PFX
- "%s: Failed dev_alloc_skb().\n",
- qdev->ndev->name);
- break;
- } else {
- /*
- * We save some space to copy the ethhdr from
- * first buffer
- */
- skb_reserve(lrg_buf_cb->skb, QL_HEADER_SPACE);
- map = pci_map_single(qdev->pdev,
- lrg_buf_cb->skb->data,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE,
- PCI_DMA_FROMDEVICE);
- lrg_buf_cb->buf_phy_addr_low =
- cpu_to_le32(LS_64BITS(map));
- lrg_buf_cb->buf_phy_addr_high =
- cpu_to_le32(MS_64BITS(map));
- pci_unmap_addr_set(lrg_buf_cb, mapaddr, map);
- pci_unmap_len_set(lrg_buf_cb, maplen,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE);
- --qdev->lrg_buf_skb_check;
- if (!qdev->lrg_buf_skb_check)
- return 1;
- }
- }
- lrg_buf_cb = lrg_buf_cb->next;
- }
- return 0;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev)
-{
- struct bufq_addr_element *lrg_buf_q_ele;
- int i;
- struct ql_rcv_buf_cb *lrg_buf_cb;
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
-
- if ((qdev->lrg_buf_free_count >= 8)
- && (qdev->lrg_buf_release_cnt >= 16)) {
-
- if (qdev->lrg_buf_skb_check)
- if (!ql_populate_free_queue(qdev))
- return;
-
- lrg_buf_q_ele = qdev->lrg_buf_next_free;
-
- while ((qdev->lrg_buf_release_cnt >= 16)
- && (qdev->lrg_buf_free_count >= 8)) {
-
- for (i = 0; i < 8; i++) {
- lrg_buf_cb =
- ql_get_from_lrg_buf_free_list(qdev);
- lrg_buf_q_ele->addr_high =
- lrg_buf_cb->buf_phy_addr_high;
- lrg_buf_q_ele->addr_low =
- lrg_buf_cb->buf_phy_addr_low;
- lrg_buf_q_ele++;
-
- qdev->lrg_buf_release_cnt--;
- }
-
- qdev->lrg_buf_q_producer_index++;
-
- if (qdev->lrg_buf_q_producer_index == NUM_LBUFQ_ENTRIES)
- qdev->lrg_buf_q_producer_index = 0;
-
- if (qdev->lrg_buf_q_producer_index ==
- (NUM_LBUFQ_ENTRIES - 1)) {
- lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr;
- }
- }
-
- qdev->lrg_buf_next_free = lrg_buf_q_ele;
-
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- rxLargeQProducerIndex,
- qdev->lrg_buf_q_producer_index);
- }
-}
-
-static void ql_process_mac_tx_intr(struct ql3_adapter *qdev,
- struct ob_mac_iocb_rsp *mac_rsp)
-{
- struct ql_tx_buf_cb *tx_cb;
-
- tx_cb = &qdev->tx_buf[mac_rsp->transaction_id];
- pci_unmap_single(qdev->pdev,
- pci_unmap_addr(tx_cb, mapaddr),
- pci_unmap_len(tx_cb, maplen), PCI_DMA_TODEVICE);
- dev_kfree_skb_irq(tx_cb->skb);
- qdev->stats.tx_packets++;
- qdev->stats.tx_bytes += tx_cb->skb->len;
- tx_cb->skb = NULL;
- atomic_inc(&qdev->tx_count);
-}
-
-static void ql_process_mac_rx_intr(struct ql3_adapter *qdev,
- struct ib_mac_iocb_rsp *ib_mac_rsp_ptr)
-{
- long int offset;
- u32 lrg_buf_phy_addr_low = 0;
- struct ql_rcv_buf_cb *lrg_buf_cb1 = NULL;
- struct ql_rcv_buf_cb *lrg_buf_cb2 = NULL;
- u32 *curr_ial_ptr;
- struct sk_buff *skb;
- u16 length = le16_to_cpu(ib_mac_rsp_ptr->length);
-
- /*
- * Get the inbound address list (small buffer).
- */
- offset = qdev->small_buf_index * QL_SMALL_BUFFER_SIZE;
- if (++qdev->small_buf_index == NUM_SMALL_BUFFERS)
- qdev->small_buf_index = 0;
-
- curr_ial_ptr = (u32 *) (qdev->small_buf_virt_addr + offset);
- qdev->last_rsp_offset = qdev->small_buf_phy_addr_low + offset;
- qdev->small_buf_release_cnt++;
-
- /* start of first buffer */
- lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
- lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index];
- qdev->lrg_buf_release_cnt++;
- if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
- qdev->lrg_buf_index = 0;
- curr_ial_ptr++; /* 64-bit pointers require two incs. */
- curr_ial_ptr++;
-
- /* start of second buffer */
- lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
- lrg_buf_cb2 = &qdev->lrg_buf[qdev->lrg_buf_index];
-
- /*
- * Second buffer gets sent up the stack.
- */
- qdev->lrg_buf_release_cnt++;
- if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
- qdev->lrg_buf_index = 0;
- skb = lrg_buf_cb2->skb;
-
- qdev->stats.rx_packets++;
- qdev->stats.rx_bytes += length;
-
- skb_put(skb, length);
- pci_unmap_single(qdev->pdev,
- pci_unmap_addr(lrg_buf_cb2, mapaddr),
- pci_unmap_len(lrg_buf_cb2, maplen),
- PCI_DMA_FROMDEVICE);
- prefetch(skb->data);
- skb->dev = qdev->ndev;
- skb->ip_summed = CHECKSUM_NONE;
- skb->protocol = eth_type_trans(skb, qdev->ndev);
-
- netif_receive_skb(skb);
- qdev->ndev->last_rx = jiffies;
- lrg_buf_cb2->skb = NULL;
-
- ql_release_to_lrg_buf_free_list(qdev, lrg_buf_cb1);
- ql_release_to_lrg_buf_free_list(qdev, lrg_buf_cb2);
-}
-
-static void ql_process_macip_rx_intr(struct ql3_adapter *qdev,
- struct ib_ip_iocb_rsp *ib_ip_rsp_ptr)
-{
- long int offset;
- u32 lrg_buf_phy_addr_low = 0;
- struct ql_rcv_buf_cb *lrg_buf_cb1 = NULL;
- struct ql_rcv_buf_cb *lrg_buf_cb2 = NULL;
- u32 *curr_ial_ptr;
- struct sk_buff *skb1, *skb2;
- struct net_device *ndev = qdev->ndev;
- u16 length = le16_to_cpu(ib_ip_rsp_ptr->length);
- u16 size = 0;
-
- /*
- * Get the inbound address list (small buffer).
- */
-
- offset = qdev->small_buf_index * QL_SMALL_BUFFER_SIZE;
- if (++qdev->small_buf_index == NUM_SMALL_BUFFERS)
- qdev->small_buf_index = 0;
- curr_ial_ptr = (u32 *) (qdev->small_buf_virt_addr + offset);
- qdev->last_rsp_offset = qdev->small_buf_phy_addr_low + offset;
- qdev->small_buf_release_cnt++;
-
- /* start of first buffer */
- lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
- lrg_buf_cb1 = &qdev->lrg_buf[qdev->lrg_buf_index];
-
- qdev->lrg_buf_release_cnt++;
- if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
- qdev->lrg_buf_index = 0;
- skb1 = lrg_buf_cb1->skb;
- curr_ial_ptr++; /* 64-bit pointers require two incs. */
- curr_ial_ptr++;
-
- /* start of second buffer */
- lrg_buf_phy_addr_low = le32_to_cpu(*curr_ial_ptr);
- lrg_buf_cb2 = &qdev->lrg_buf[qdev->lrg_buf_index];
- skb2 = lrg_buf_cb2->skb;
- qdev->lrg_buf_release_cnt++;
- if (++qdev->lrg_buf_index == NUM_LARGE_BUFFERS)
- qdev->lrg_buf_index = 0;
-
- qdev->stats.rx_packets++;
- qdev->stats.rx_bytes += length;
-
- /*
- * Copy the ethhdr from first buffer to second. This
- * is necessary for IP completions.
- */
- if (*((u16 *) skb1->data) != 0xFFFF)
- size = VLAN_ETH_HLEN;
- else
- size = ETH_HLEN;
-
- skb_put(skb2, length); /* Just the second buffer length here. */
- pci_unmap_single(qdev->pdev,
- pci_unmap_addr(lrg_buf_cb2, mapaddr),
- pci_unmap_len(lrg_buf_cb2, maplen),
- PCI_DMA_FROMDEVICE);
- prefetch(skb2->data);
-
- memcpy(skb_push(skb2, size), skb1->data + VLAN_ID_LEN, size);
- skb2->dev = qdev->ndev;
- skb2->ip_summed = CHECKSUM_NONE;
- skb2->protocol = eth_type_trans(skb2, qdev->ndev);
-
- netif_receive_skb(skb2);
- ndev->last_rx = jiffies;
- lrg_buf_cb2->skb = NULL;
-
- ql_release_to_lrg_buf_free_list(qdev, lrg_buf_cb1);
- ql_release_to_lrg_buf_free_list(qdev, lrg_buf_cb2);
-}
-
-static int ql_tx_rx_clean(struct ql3_adapter *qdev,
- int *tx_cleaned, int *rx_cleaned, int work_to_do)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- struct net_rsp_iocb *net_rsp;
- struct net_device *ndev = qdev->ndev;
- unsigned long hw_flags;
-
- /* While there are entries in the completion queue. */
- while ((cpu_to_le32(*(qdev->prsp_producer_index)) !=
- qdev->rsp_consumer_index) && (*rx_cleaned < work_to_do)) {
-
- net_rsp = qdev->rsp_current;
- switch (net_rsp->opcode) {
-
- case OPCODE_OB_MAC_IOCB_FN0:
- case OPCODE_OB_MAC_IOCB_FN2:
- ql_process_mac_tx_intr(qdev, (struct ob_mac_iocb_rsp *)
- net_rsp);
- (*tx_cleaned)++;
- break;
-
- case OPCODE_IB_MAC_IOCB:
- ql_process_mac_rx_intr(qdev, (struct ib_mac_iocb_rsp *)
- net_rsp);
- (*rx_cleaned)++;
- break;
-
- case OPCODE_IB_IP_IOCB:
- ql_process_macip_rx_intr(qdev, (struct ib_ip_iocb_rsp *)
- net_rsp);
- (*rx_cleaned)++;
- break;
- default:
- {
- u32 *tmp = (u32 *) net_rsp;
- printk(KERN_ERR PFX
- "%s: Hit default case, not "
- "handled!\n"
- " dropping the packet, opcode = "
- "%x.\n",
- ndev->name, net_rsp->opcode);
- printk(KERN_ERR PFX
- "0x%08lx 0x%08lx 0x%08lx 0x%08lx \n",
- (unsigned long int)tmp[0],
- (unsigned long int)tmp[1],
- (unsigned long int)tmp[2],
- (unsigned long int)tmp[3]);
- }
- }
-
- qdev->rsp_consumer_index++;
-
- if (qdev->rsp_consumer_index == NUM_RSP_Q_ENTRIES) {
- qdev->rsp_consumer_index = 0;
- qdev->rsp_current = qdev->rsp_q_virt_addr;
- } else {
- qdev->rsp_current++;
- }
- }
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
-
- ql_update_lrg_bufq_prod_index(qdev);
-
- if (qdev->small_buf_release_cnt >= 16) {
- while (qdev->small_buf_release_cnt >= 16) {
- qdev->small_buf_q_producer_index++;
-
- if (qdev->small_buf_q_producer_index ==
- NUM_SBUFQ_ENTRIES)
- qdev->small_buf_q_producer_index = 0;
- qdev->small_buf_release_cnt -= 8;
- }
-
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- rxSmallQProducerIndex,
- qdev->small_buf_q_producer_index);
- }
-
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.rspQConsumerIndex,
- qdev->rsp_consumer_index);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-
- if (unlikely(netif_queue_stopped(qdev->ndev))) {
- if (netif_queue_stopped(qdev->ndev) &&
- (atomic_read(&qdev->tx_count) > (NUM_REQ_Q_ENTRIES / 4)))
- netif_wake_queue(qdev->ndev);
- }
-
- return *tx_cleaned + *rx_cleaned;
-}
-
-static int ql_poll(struct net_device *ndev, int *budget)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- int work_to_do = min(*budget, ndev->quota);
- int rx_cleaned = 0, tx_cleaned = 0;
-
- if (!netif_carrier_ok(ndev))
- goto quit_polling;
-
- ql_tx_rx_clean(qdev, &tx_cleaned, &rx_cleaned, work_to_do);
- *budget -= rx_cleaned;
- ndev->quota -= rx_cleaned;
-
- if ((!tx_cleaned && !rx_cleaned) || !netif_running(ndev)) {
-quit_polling:
- netif_rx_complete(ndev);
- ql_enable_interrupts(qdev);
- return 0;
- }
- return 1;
-}
-
-static irqreturn_t ql3xxx_isr(int irq, void *dev_id, struct pt_regs *regs)
-{
-
- struct net_device *ndev = dev_id;
- struct ql3_adapter *qdev = netdev_priv(ndev);
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- u32 value;
- int handled = 1;
- u32 var;
-
- port_regs = qdev->mem_map_registers;
-
- value =
- ql_read_common_reg_l(qdev, &port_regs->CommonRegs.ispControlStatus);
-
- if (value & (ISP_CONTROL_FE | ISP_CONTROL_RI)) {
- spin_lock(&qdev->adapter_lock);
- netif_stop_queue(qdev->ndev);
- netif_carrier_off(qdev->ndev);
- ql_disable_interrupts(qdev);
- qdev->port_link_state = LS_DOWN;
- set_bit(QL_RESET_ACTIVE,&qdev->flags) ;
-
- if (value & ISP_CONTROL_FE) {
- /*
- * Chip Fatal Error.
- */
- var =
- ql_read_page0_reg_l(qdev,
- &port_regs->PortFatalErrStatus);
- printk(KERN_WARNING PFX
- "%s: Resetting chip. PortFatalErrStatus "
- "register = 0x%x\n", ndev->name, var);
- set_bit(QL_RESET_START,&qdev->flags) ;
- } else {
- /*
- * Soft Reset Requested.
- */
- set_bit(QL_RESET_PER_SCSI,&qdev->flags) ;
- printk(KERN_ERR PFX
- "%s: Another function issued a reset to the "
- "chip. ISR value = %x.\n", ndev->name, value);
- }
- queue_work(qdev->workqueue, &qdev->reset_work);
- spin_unlock(&qdev->adapter_lock);
- } else if (value & ISP_IMR_DISABLE_CMPL_INT) {
- ql_disable_interrupts(qdev);
- if (likely(netif_rx_schedule_prep(ndev)))
- __netif_rx_schedule(ndev);
- else
- ql_enable_interrupts(qdev);
- } else {
- return IRQ_NONE;
- }
-
- return IRQ_RETVAL(handled);
-}
-
-static int ql3xxx_send(struct sk_buff *skb, struct net_device *ndev)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)netdev_priv(ndev);
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- struct ql_tx_buf_cb *tx_cb;
- struct ob_mac_iocb_req *mac_iocb_ptr;
- u64 map;
-
- if (unlikely(atomic_read(&qdev->tx_count) < 2)) {
- if (!netif_queue_stopped(ndev))
- netif_stop_queue(ndev);
- return NETDEV_TX_BUSY;
- }
- tx_cb = &qdev->tx_buf[qdev->req_producer_index] ;
- mac_iocb_ptr = tx_cb->queue_entry;
- memset((void *)mac_iocb_ptr, 0, sizeof(struct ob_mac_iocb_req));
- mac_iocb_ptr->opcode = qdev->mac_ob_opcode;
- mac_iocb_ptr->flags |= qdev->mb_bit_mask;
- mac_iocb_ptr->transaction_id = qdev->req_producer_index;
- mac_iocb_ptr->data_len = cpu_to_le16((u16) skb->len);
- tx_cb->skb = skb;
- map = pci_map_single(qdev->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
- mac_iocb_ptr->buf_addr0_low = cpu_to_le32(LS_64BITS(map));
- mac_iocb_ptr->buf_addr0_high = cpu_to_le32(MS_64BITS(map));
- mac_iocb_ptr->buf_0_len = cpu_to_le32(skb->len | OB_MAC_IOCB_REQ_E);
- pci_unmap_addr_set(tx_cb, mapaddr, map);
- pci_unmap_len_set(tx_cb, maplen, skb->len);
- atomic_dec(&qdev->tx_count);
-
- qdev->req_producer_index++;
- if (qdev->req_producer_index == NUM_REQ_Q_ENTRIES)
- qdev->req_producer_index = 0;
- wmb();
- ql_write_common_reg_l(qdev,
- (u32 *) & port_regs->CommonRegs.reqQProducerIndex,
- qdev->req_producer_index);
-
- ndev->trans_start = jiffies;
- if (netif_msg_tx_queued(qdev))
- printk(KERN_DEBUG PFX "%s: tx queued, slot %d, len %d\n",
- ndev->name, qdev->req_producer_index, skb->len);
-
- return NETDEV_TX_OK;
-}
-static int ql_alloc_net_req_rsp_queues(struct ql3_adapter *qdev)
-{
- qdev->req_q_size =
- (u32) (NUM_REQ_Q_ENTRIES * sizeof(struct ob_mac_iocb_req));
-
- qdev->req_q_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- (size_t) qdev->req_q_size,
- &qdev->req_q_phy_addr);
-
- if ((qdev->req_q_virt_addr == NULL) ||
- LS_64BITS(qdev->req_q_phy_addr) & (qdev->req_q_size - 1)) {
- printk(KERN_ERR PFX "%s: reqQ failed.\n",
- qdev->ndev->name);
- return -ENOMEM;
- }
-
- qdev->rsp_q_size = NUM_RSP_Q_ENTRIES * sizeof(struct net_rsp_iocb);
-
- qdev->rsp_q_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- (size_t) qdev->rsp_q_size,
- &qdev->rsp_q_phy_addr);
-
- if ((qdev->rsp_q_virt_addr == NULL) ||
- LS_64BITS(qdev->rsp_q_phy_addr) & (qdev->rsp_q_size - 1)) {
- printk(KERN_ERR PFX
- "%s: rspQ allocation failed\n",
- qdev->ndev->name);
- pci_free_consistent(qdev->pdev, (size_t) qdev->req_q_size,
- qdev->req_q_virt_addr,
- qdev->req_q_phy_addr);
- return -ENOMEM;
- }
-
- set_bit(QL_ALLOC_REQ_RSP_Q_DONE,&qdev->flags);
-
- return 0;
-}
-
-static void ql_free_net_req_rsp_queues(struct ql3_adapter *qdev)
-{
- if (!test_bit(QL_ALLOC_REQ_RSP_Q_DONE,&qdev->flags)) {
- printk(KERN_INFO PFX
- "%s: Already done.\n", qdev->ndev->name);
- return;
- }
-
- pci_free_consistent(qdev->pdev,
- qdev->req_q_size,
- qdev->req_q_virt_addr, qdev->req_q_phy_addr);
-
- qdev->req_q_virt_addr = NULL;
-
- pci_free_consistent(qdev->pdev,
- qdev->rsp_q_size,
- qdev->rsp_q_virt_addr, qdev->rsp_q_phy_addr);
-
- qdev->rsp_q_virt_addr = NULL;
-
- clear_bit(QL_ALLOC_REQ_RSP_Q_DONE,&qdev->flags);
-}
-
-static int ql_alloc_buffer_queues(struct ql3_adapter *qdev)
-{
- /* Create Large Buffer Queue */
- qdev->lrg_buf_q_size =
- NUM_LBUFQ_ENTRIES * sizeof(struct lrg_buf_q_entry);
- if (qdev->lrg_buf_q_size < PAGE_SIZE)
- qdev->lrg_buf_q_alloc_size = PAGE_SIZE;
- else
- qdev->lrg_buf_q_alloc_size = qdev->lrg_buf_q_size * 2;
-
- qdev->lrg_buf_q_alloc_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- qdev->lrg_buf_q_alloc_size,
- &qdev->lrg_buf_q_alloc_phy_addr);
-
- if (qdev->lrg_buf_q_alloc_virt_addr == NULL) {
- printk(KERN_ERR PFX
- "%s: lBufQ failed\n", qdev->ndev->name);
- return -ENOMEM;
- }
- qdev->lrg_buf_q_virt_addr = qdev->lrg_buf_q_alloc_virt_addr;
- qdev->lrg_buf_q_phy_addr = qdev->lrg_buf_q_alloc_phy_addr;
-
- /* Create Small Buffer Queue */
- qdev->small_buf_q_size =
- NUM_SBUFQ_ENTRIES * sizeof(struct lrg_buf_q_entry);
- if (qdev->small_buf_q_size < PAGE_SIZE)
- qdev->small_buf_q_alloc_size = PAGE_SIZE;
- else
- qdev->small_buf_q_alloc_size = qdev->small_buf_q_size * 2;
-
- qdev->small_buf_q_alloc_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- qdev->small_buf_q_alloc_size,
- &qdev->small_buf_q_alloc_phy_addr);
-
- if (qdev->small_buf_q_alloc_virt_addr == NULL) {
- printk(KERN_ERR PFX
- "%s: Small Buffer Queue allocation failed.\n",
- qdev->ndev->name);
- pci_free_consistent(qdev->pdev, qdev->lrg_buf_q_alloc_size,
- qdev->lrg_buf_q_alloc_virt_addr,
- qdev->lrg_buf_q_alloc_phy_addr);
- return -ENOMEM;
- }
-
- qdev->small_buf_q_virt_addr = qdev->small_buf_q_alloc_virt_addr;
- qdev->small_buf_q_phy_addr = qdev->small_buf_q_alloc_phy_addr;
- set_bit(QL_ALLOC_BUFQS_DONE,&qdev->flags);
- return 0;
-}
-
-static void ql_free_buffer_queues(struct ql3_adapter *qdev)
-{
- if (!test_bit(QL_ALLOC_BUFQS_DONE,&qdev->flags)) {
- printk(KERN_INFO PFX
- "%s: Already done.\n", qdev->ndev->name);
- return;
- }
-
- pci_free_consistent(qdev->pdev,
- qdev->lrg_buf_q_alloc_size,
- qdev->lrg_buf_q_alloc_virt_addr,
- qdev->lrg_buf_q_alloc_phy_addr);
-
- qdev->lrg_buf_q_virt_addr = NULL;
-
- pci_free_consistent(qdev->pdev,
- qdev->small_buf_q_alloc_size,
- qdev->small_buf_q_alloc_virt_addr,
- qdev->small_buf_q_alloc_phy_addr);
-
- qdev->small_buf_q_virt_addr = NULL;
-
- clear_bit(QL_ALLOC_BUFQS_DONE,&qdev->flags);
-}
-
-static int ql_alloc_small_buffers(struct ql3_adapter *qdev)
-{
- int i;
- struct bufq_addr_element *small_buf_q_entry;
-
- /* Currently we allocate on one of memory and use it for smallbuffers */
- qdev->small_buf_total_size =
- (QL_ADDR_ELE_PER_BUFQ_ENTRY * NUM_SBUFQ_ENTRIES *
- QL_SMALL_BUFFER_SIZE);
-
- qdev->small_buf_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- qdev->small_buf_total_size,
- &qdev->small_buf_phy_addr);
-
- if (qdev->small_buf_virt_addr == NULL) {
- printk(KERN_ERR PFX
- "%s: Failed to get small buffer memory.\n",
- qdev->ndev->name);
- return -ENOMEM;
- }
-
- qdev->small_buf_phy_addr_low = LS_64BITS(qdev->small_buf_phy_addr);
- qdev->small_buf_phy_addr_high = MS_64BITS(qdev->small_buf_phy_addr);
-
- small_buf_q_entry = qdev->small_buf_q_virt_addr;
-
- qdev->last_rsp_offset = qdev->small_buf_phy_addr_low;
-
- /* Initialize the small buffer queue. */
- for (i = 0; i < (QL_ADDR_ELE_PER_BUFQ_ENTRY * NUM_SBUFQ_ENTRIES); i++) {
- small_buf_q_entry->addr_high =
- cpu_to_le32(qdev->small_buf_phy_addr_high);
- small_buf_q_entry->addr_low =
- cpu_to_le32(qdev->small_buf_phy_addr_low +
- (i * QL_SMALL_BUFFER_SIZE));
- small_buf_q_entry++;
- }
- qdev->small_buf_index = 0;
- set_bit(QL_ALLOC_SMALL_BUF_DONE,&qdev->flags);
- return 0;
-}
-
-static void ql_free_small_buffers(struct ql3_adapter *qdev)
-{
- if (!test_bit(QL_ALLOC_SMALL_BUF_DONE,&qdev->flags)) {
- printk(KERN_INFO PFX
- "%s: Already done.\n", qdev->ndev->name);
- return;
- }
- if (qdev->small_buf_virt_addr != NULL) {
- pci_free_consistent(qdev->pdev,
- qdev->small_buf_total_size,
- qdev->small_buf_virt_addr,
- qdev->small_buf_phy_addr);
-
- qdev->small_buf_virt_addr = NULL;
- }
-}
-
-static void ql_free_large_buffers(struct ql3_adapter *qdev)
-{
- int i = 0;
- struct ql_rcv_buf_cb *lrg_buf_cb;
-
- for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
- lrg_buf_cb = &qdev->lrg_buf[i];
- if (lrg_buf_cb->skb) {
- dev_kfree_skb(lrg_buf_cb->skb);
- pci_unmap_single(qdev->pdev,
- pci_unmap_addr(lrg_buf_cb, mapaddr),
- pci_unmap_len(lrg_buf_cb, maplen),
- PCI_DMA_FROMDEVICE);
- memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb));
- } else {
- break;
- }
- }
-}
-
-static void ql_init_large_buffers(struct ql3_adapter *qdev)
-{
- int i;
- struct ql_rcv_buf_cb *lrg_buf_cb;
- struct bufq_addr_element *buf_addr_ele = qdev->lrg_buf_q_virt_addr;
-
- for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
- lrg_buf_cb = &qdev->lrg_buf[i];
- buf_addr_ele->addr_high = lrg_buf_cb->buf_phy_addr_high;
- buf_addr_ele->addr_low = lrg_buf_cb->buf_phy_addr_low;
- buf_addr_ele++;
- }
- qdev->lrg_buf_index = 0;
- qdev->lrg_buf_skb_check = 0;
-}
-
-static int ql_alloc_large_buffers(struct ql3_adapter *qdev)
-{
- int i;
- struct ql_rcv_buf_cb *lrg_buf_cb;
- struct sk_buff *skb;
- u64 map;
-
- for (i = 0; i < NUM_LARGE_BUFFERS; i++) {
- skb = dev_alloc_skb(qdev->lrg_buffer_len);
- if (unlikely(!skb)) {
- /* Better luck next round */
- printk(KERN_ERR PFX
- "%s: large buff alloc failed, "
- "for %d bytes at index %d.\n",
- qdev->ndev->name,
- qdev->lrg_buffer_len * 2, i);
- ql_free_large_buffers(qdev);
- return -ENOMEM;
- } else {
-
- lrg_buf_cb = &qdev->lrg_buf[i];
- memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb));
- lrg_buf_cb->index = i;
- lrg_buf_cb->skb = skb;
- /*
- * We save some space to copy the ethhdr from first
- * buffer
- */
- skb_reserve(skb, QL_HEADER_SPACE);
- map = pci_map_single(qdev->pdev,
- skb->data,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE,
- PCI_DMA_FROMDEVICE);
- pci_unmap_addr_set(lrg_buf_cb, mapaddr, map);
- pci_unmap_len_set(lrg_buf_cb, maplen,
- qdev->lrg_buffer_len -
- QL_HEADER_SPACE);
- lrg_buf_cb->buf_phy_addr_low =
- cpu_to_le32(LS_64BITS(map));
- lrg_buf_cb->buf_phy_addr_high =
- cpu_to_le32(MS_64BITS(map));
- }
- }
- return 0;
-}
-
-static void ql_create_send_free_list(struct ql3_adapter *qdev)
-{
- struct ql_tx_buf_cb *tx_cb;
- int i;
- struct ob_mac_iocb_req *req_q_curr =
- qdev->req_q_virt_addr;
-
- /* Create free list of transmit buffers */
- for (i = 0; i < NUM_REQ_Q_ENTRIES; i++) {
- tx_cb = &qdev->tx_buf[i];
- tx_cb->skb = NULL;
- tx_cb->queue_entry = req_q_curr;
- req_q_curr++;
- }
-}
-
-static int ql_alloc_mem_resources(struct ql3_adapter *qdev)
-{
- if (qdev->ndev->mtu == NORMAL_MTU_SIZE)
- qdev->lrg_buffer_len = NORMAL_MTU_SIZE;
- else if (qdev->ndev->mtu == JUMBO_MTU_SIZE) {
- qdev->lrg_buffer_len = JUMBO_MTU_SIZE;
- } else {
- printk(KERN_ERR PFX
- "%s: Invalid mtu size. Only 1500 and 9000 are accepted.\n",
- qdev->ndev->name);
- return -ENOMEM;
- }
- qdev->lrg_buffer_len += VLAN_ETH_HLEN + VLAN_ID_LEN + QL_HEADER_SPACE;
- qdev->max_frame_size =
- (qdev->lrg_buffer_len - QL_HEADER_SPACE) + ETHERNET_CRC_SIZE;
-
- /*
- * First allocate a page of shared memory and use it for shadow
- * locations of Network Request Queue Consumer Address Register and
- * Network Completion Queue Producer Index Register
- */
- qdev->shadow_reg_virt_addr =
- pci_alloc_consistent(qdev->pdev,
- PAGE_SIZE, &qdev->shadow_reg_phy_addr);
-
- if (qdev->shadow_reg_virt_addr != NULL) {
- qdev->preq_consumer_index = (u16 *) qdev->shadow_reg_virt_addr;
- qdev->req_consumer_index_phy_addr_high =
- MS_64BITS(qdev->shadow_reg_phy_addr);
- qdev->req_consumer_index_phy_addr_low =
- LS_64BITS(qdev->shadow_reg_phy_addr);
-
- qdev->prsp_producer_index =
- (u32 *) (((u8 *) qdev->preq_consumer_index) + 8);
- qdev->rsp_producer_index_phy_addr_high =
- qdev->req_consumer_index_phy_addr_high;
- qdev->rsp_producer_index_phy_addr_low =
- qdev->req_consumer_index_phy_addr_low + 8;
- } else {
- printk(KERN_ERR PFX
- "%s: shadowReg Alloc failed.\n", qdev->ndev->name);
- return -ENOMEM;
- }
-
- if (ql_alloc_net_req_rsp_queues(qdev) != 0) {
- printk(KERN_ERR PFX
- "%s: ql_alloc_net_req_rsp_queues failed.\n",
- qdev->ndev->name);
- goto err_req_rsp;
- }
-
- if (ql_alloc_buffer_queues(qdev) != 0) {
- printk(KERN_ERR PFX
- "%s: ql_alloc_buffer_queues failed.\n",
- qdev->ndev->name);
- goto err_buffer_queues;
- }
-
- if (ql_alloc_small_buffers(qdev) != 0) {
- printk(KERN_ERR PFX
- "%s: ql_alloc_small_buffers failed\n", qdev->ndev->name);
- goto err_small_buffers;
- }
-
- if (ql_alloc_large_buffers(qdev) != 0) {
- printk(KERN_ERR PFX
- "%s: ql_alloc_large_buffers failed\n", qdev->ndev->name);
- goto err_small_buffers;
- }
-
- /* Initialize the large buffer queue. */
- ql_init_large_buffers(qdev);
- ql_create_send_free_list(qdev);
-
- qdev->rsp_current = qdev->rsp_q_virt_addr;
-
- return 0;
-
-err_small_buffers:
- ql_free_buffer_queues(qdev);
-err_buffer_queues:
- ql_free_net_req_rsp_queues(qdev);
-err_req_rsp:
- pci_free_consistent(qdev->pdev,
- PAGE_SIZE,
- qdev->shadow_reg_virt_addr,
- qdev->shadow_reg_phy_addr);
-
- return -ENOMEM;
-}
-
-static void ql_free_mem_resources(struct ql3_adapter *qdev)
-{
- ql_free_large_buffers(qdev);
- ql_free_small_buffers(qdev);
- ql_free_buffer_queues(qdev);
- ql_free_net_req_rsp_queues(qdev);
- if (qdev->shadow_reg_virt_addr != NULL) {
- pci_free_consistent(qdev->pdev,
- PAGE_SIZE,
- qdev->shadow_reg_virt_addr,
- qdev->shadow_reg_phy_addr);
- qdev->shadow_reg_virt_addr = NULL;
- }
-}
-
-static int ql_init_misc_registers(struct ql3_adapter *qdev)
-{
- struct ql3xxx_local_ram_registers *local_ram =
- (struct ql3xxx_local_ram_registers *)qdev->mem_map_registers;
-
- if(ql_sem_spinlock(qdev, QL_DDR_RAM_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 4))
- return -1;
-
- ql_write_page2_reg(qdev,
- &local_ram->bufletSize, qdev->nvram_data.bufletSize);
-
- ql_write_page2_reg(qdev,
- &local_ram->maxBufletCount,
- qdev->nvram_data.bufletCount);
-
- ql_write_page2_reg(qdev,
- &local_ram->freeBufletThresholdLow,
- (qdev->nvram_data.tcpWindowThreshold25 << 16) |
- (qdev->nvram_data.tcpWindowThreshold0));
-
- ql_write_page2_reg(qdev,
- &local_ram->freeBufletThresholdHigh,
- qdev->nvram_data.tcpWindowThreshold50);
-
- ql_write_page2_reg(qdev,
- &local_ram->ipHashTableBase,
- (qdev->nvram_data.ipHashTableBaseHi << 16) |
- qdev->nvram_data.ipHashTableBaseLo);
- ql_write_page2_reg(qdev,
- &local_ram->ipHashTableCount,
- qdev->nvram_data.ipHashTableSize);
- ql_write_page2_reg(qdev,
- &local_ram->tcpHashTableBase,
- (qdev->nvram_data.tcpHashTableBaseHi << 16) |
- qdev->nvram_data.tcpHashTableBaseLo);
- ql_write_page2_reg(qdev,
- &local_ram->tcpHashTableCount,
- qdev->nvram_data.tcpHashTableSize);
- ql_write_page2_reg(qdev,
- &local_ram->ncbBase,
- (qdev->nvram_data.ncbTableBaseHi << 16) |
- qdev->nvram_data.ncbTableBaseLo);
- ql_write_page2_reg(qdev,
- &local_ram->maxNcbCount,
- qdev->nvram_data.ncbTableSize);
- ql_write_page2_reg(qdev,
- &local_ram->drbBase,
- (qdev->nvram_data.drbTableBaseHi << 16) |
- qdev->nvram_data.drbTableBaseLo);
- ql_write_page2_reg(qdev,
- &local_ram->maxDrbCount,
- qdev->nvram_data.drbTableSize);
- ql_sem_unlock(qdev, QL_DDR_RAM_SEM_MASK);
- return 0;
-}
-
-static int ql_adapter_initialize(struct ql3_adapter *qdev)
-{
- u32 value;
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- struct ql3xxx_host_memory_registers __iomem *hmem_regs =
- (struct ql3xxx_host_memory_registers *)port_regs;
- u32 delay = 10;
- int status = 0;
-
- if(ql_mii_setup(qdev))
- return -1;
-
- /* Bring out PHY out of reset */
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- (ISP_SERIAL_PORT_IF_WE |
- (ISP_SERIAL_PORT_IF_WE << 16)));
-
- qdev->port_link_state = LS_DOWN;
- netif_carrier_off(qdev->ndev);
-
- /* V2 chip fix for ARS-39168. */
- ql_write_common_reg(qdev, &port_regs->CommonRegs.serialPortInterfaceReg,
- (ISP_SERIAL_PORT_IF_SDE |
- (ISP_SERIAL_PORT_IF_SDE << 16)));
-
- /* Request Queue Registers */
- *((u32 *) (qdev->preq_consumer_index)) = 0;
- atomic_set(&qdev->tx_count,NUM_REQ_Q_ENTRIES);
- qdev->req_producer_index = 0;
-
- ql_write_page1_reg(qdev,
- &hmem_regs->reqConsumerIndexAddrHigh,
- qdev->req_consumer_index_phy_addr_high);
- ql_write_page1_reg(qdev,
- &hmem_regs->reqConsumerIndexAddrLow,
- qdev->req_consumer_index_phy_addr_low);
-
- ql_write_page1_reg(qdev,
- &hmem_regs->reqBaseAddrHigh,
- MS_64BITS(qdev->req_q_phy_addr));
- ql_write_page1_reg(qdev,
- &hmem_regs->reqBaseAddrLow,
- LS_64BITS(qdev->req_q_phy_addr));
- ql_write_page1_reg(qdev, &hmem_regs->reqLength, NUM_REQ_Q_ENTRIES);
-
- /* Response Queue Registers */
- *((u16 *) (qdev->prsp_producer_index)) = 0;
- qdev->rsp_consumer_index = 0;
- qdev->rsp_current = qdev->rsp_q_virt_addr;
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rspProducerIndexAddrHigh,
- qdev->rsp_producer_index_phy_addr_high);
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rspProducerIndexAddrLow,
- qdev->rsp_producer_index_phy_addr_low);
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rspBaseAddrHigh,
- MS_64BITS(qdev->rsp_q_phy_addr));
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rspBaseAddrLow,
- LS_64BITS(qdev->rsp_q_phy_addr));
-
- ql_write_page1_reg(qdev, &hmem_regs->rspLength, NUM_RSP_Q_ENTRIES);
-
- /* Large Buffer Queue */
- ql_write_page1_reg(qdev,
- &hmem_regs->rxLargeQBaseAddrHigh,
- MS_64BITS(qdev->lrg_buf_q_phy_addr));
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rxLargeQBaseAddrLow,
- LS_64BITS(qdev->lrg_buf_q_phy_addr));
-
- ql_write_page1_reg(qdev, &hmem_regs->rxLargeQLength, NUM_LBUFQ_ENTRIES);
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rxLargeBufferLength,
- qdev->lrg_buffer_len);
-
- /* Small Buffer Queue */
- ql_write_page1_reg(qdev,
- &hmem_regs->rxSmallQBaseAddrHigh,
- MS_64BITS(qdev->small_buf_q_phy_addr));
-
- ql_write_page1_reg(qdev,
- &hmem_regs->rxSmallQBaseAddrLow,
- LS_64BITS(qdev->small_buf_q_phy_addr));
-
- ql_write_page1_reg(qdev, &hmem_regs->rxSmallQLength, NUM_SBUFQ_ENTRIES);
- ql_write_page1_reg(qdev,
- &hmem_regs->rxSmallBufferLength,
- QL_SMALL_BUFFER_SIZE);
-
- qdev->small_buf_q_producer_index = NUM_SBUFQ_ENTRIES - 1;
- qdev->small_buf_release_cnt = 8;
- qdev->lrg_buf_q_producer_index = NUM_LBUFQ_ENTRIES - 1;
- qdev->lrg_buf_release_cnt = 8;
- qdev->lrg_buf_next_free =
- (struct bufq_addr_element *)qdev->lrg_buf_q_virt_addr;
- qdev->small_buf_index = 0;
- qdev->lrg_buf_index = 0;
- qdev->lrg_buf_free_count = 0;
- qdev->lrg_buf_free_head = NULL;
- qdev->lrg_buf_free_tail = NULL;
-
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- rxSmallQProducerIndex,
- qdev->small_buf_q_producer_index);
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- rxLargeQProducerIndex,
- qdev->lrg_buf_q_producer_index);
-
- /*
- * Find out if the chip has already been initialized. If it has, then
- * we skip some of the initialization.
- */
- clear_bit(QL_LINK_MASTER, &qdev->flags);
- value = ql_read_page0_reg(qdev, &port_regs->portStatus);
- if ((value & PORT_STATUS_IC) == 0) {
-
- /* Chip has not been configured yet, so let it rip. */
- if(ql_init_misc_registers(qdev)) {
- status = -1;
- goto out;
- }
-
- if (qdev->mac_index)
- ql_write_page0_reg(qdev,
- &port_regs->mac1MaxFrameLengthReg,
- qdev->max_frame_size);
- else
- ql_write_page0_reg(qdev,
- &port_regs->mac0MaxFrameLengthReg,
- qdev->max_frame_size);
-
- value = qdev->nvram_data.tcpMaxWindowSize;
- ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value);
-
- value = (0xFFFF << 16) | qdev->nvram_data.extHwConfig;
-
- if(ql_sem_spinlock(qdev, QL_FLASH_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index)
- * 2) << 13)) {
- status = -1;
- goto out;
- }
- ql_write_page0_reg(qdev, &port_regs->ExternalHWConfig, value);
- ql_write_page0_reg(qdev, &port_regs->InternalChipConfig,
- (((INTERNAL_CHIP_SD | INTERNAL_CHIP_WE) <<
- 16) | (INTERNAL_CHIP_SD |
- INTERNAL_CHIP_WE)));
- ql_sem_unlock(qdev, QL_FLASH_SEM_MASK);
- }
-
-
- if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK,
- (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) *
- 2) << 7)) {
- status = -1;
- goto out;
- }
-
- ql_init_scan_mode(qdev);
- ql_get_phy_owner(qdev);
-
- /* Load the MAC Configuration */
-
- /* Program lower 32 bits of the MAC address */
- ql_write_page0_reg(qdev, &port_regs->macAddrIndirectPtrReg,
- (MAC_ADDR_INDIRECT_PTR_REG_RP_MASK << 16));
- ql_write_page0_reg(qdev, &port_regs->macAddrDataReg,
- ((qdev->ndev->dev_addr[2] << 24)
- | (qdev->ndev->dev_addr[3] << 16)
- | (qdev->ndev->dev_addr[4] << 8)
- | qdev->ndev->dev_addr[5]));
-
- /* Program top 16 bits of the MAC address */
- ql_write_page0_reg(qdev, &port_regs->macAddrIndirectPtrReg,
- ((MAC_ADDR_INDIRECT_PTR_REG_RP_MASK << 16) | 1));
- ql_write_page0_reg(qdev, &port_regs->macAddrDataReg,
- ((qdev->ndev->dev_addr[0] << 8)
- | qdev->ndev->dev_addr[1]));
-
- /* Enable Primary MAC */
- ql_write_page0_reg(qdev, &port_regs->macAddrIndirectPtrReg,
- ((MAC_ADDR_INDIRECT_PTR_REG_PE << 16) |
- MAC_ADDR_INDIRECT_PTR_REG_PE));
-
- /* Clear Primary and Secondary IP addresses */
- ql_write_page0_reg(qdev, &port_regs->ipAddrIndexReg,
- ((IP_ADDR_INDEX_REG_MASK << 16) |
- (qdev->mac_index << 2)));
- ql_write_page0_reg(qdev, &port_regs->ipAddrDataReg, 0);
-
- ql_write_page0_reg(qdev, &port_regs->ipAddrIndexReg,
- ((IP_ADDR_INDEX_REG_MASK << 16) |
- ((qdev->mac_index << 2) + 1)));
- ql_write_page0_reg(qdev, &port_regs->ipAddrDataReg, 0);
-
- ql_sem_unlock(qdev, QL_PHY_GIO_SEM_MASK);
-
- /* Indicate Configuration Complete */
- ql_write_page0_reg(qdev,
- &port_regs->portControl,
- ((PORT_CONTROL_CC << 16) | PORT_CONTROL_CC));
-
- do {
- value = ql_read_page0_reg(qdev, &port_regs->portStatus);
- if (value & PORT_STATUS_IC)
- break;
- msleep(500);
- } while (--delay);
-
- if (delay == 0) {
- printk(KERN_ERR PFX
- "%s: Hw Initialization timeout.\n", qdev->ndev->name);
- status = -1;
- goto out;
- }
-
- /* Enable Ethernet Function */
- value =
- (PORT_CONTROL_EF | PORT_CONTROL_ET | PORT_CONTROL_EI |
- PORT_CONTROL_HH);
- ql_write_page0_reg(qdev, &port_regs->portControl,
- ((value << 16) | value));
-
-out:
- return status;
-}
-
-/*
- * Caller holds hw_lock.
- */
-static int ql_adapter_reset(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- int status = 0;
- u16 value;
- int max_wait_time;
-
- set_bit(QL_RESET_ACTIVE, &qdev->flags);
- clear_bit(QL_RESET_DONE, &qdev->flags);
-
- /*
- * Issue soft reset to chip.
- */
- printk(KERN_DEBUG PFX
- "%s: Issue soft reset to chip.\n",
- qdev->ndev->name);
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.ispControlStatus,
- ((ISP_CONTROL_SR << 16) | ISP_CONTROL_SR));
-
- /* Wait 3 seconds for reset to complete. */
- printk(KERN_DEBUG PFX
- "%s: Wait 10 milliseconds for reset to complete.\n",
- qdev->ndev->name);
-
- /* Wait until the firmware tells us the Soft Reset is done */
- max_wait_time = 5;
- do {
- value =
- ql_read_common_reg(qdev,
- &port_regs->CommonRegs.ispControlStatus);
- if ((value & ISP_CONTROL_SR) == 0)
- break;
-
- ssleep(1);
- } while ((--max_wait_time));
-
- /*
- * Also, make sure that the Network Reset Interrupt bit has been
- * cleared after the soft reset has taken place.
- */
- value =
- ql_read_common_reg(qdev, &port_regs->CommonRegs.ispControlStatus);
- if (value & ISP_CONTROL_RI) {
- printk(KERN_DEBUG PFX
- "ql_adapter_reset: clearing RI after reset.\n");
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- ispControlStatus,
- ((ISP_CONTROL_RI << 16) | ISP_CONTROL_RI));
- }
-
- if (max_wait_time == 0) {
- /* Issue Force Soft Reset */
- ql_write_common_reg(qdev,
- (u32 *) & port_regs->CommonRegs.
- ispControlStatus,
- ((ISP_CONTROL_FSR << 16) |
- ISP_CONTROL_FSR));
- /*
- * Wait until the firmware tells us the Force Soft Reset is
- * done
- */
- max_wait_time = 5;
- do {
- value =
- ql_read_common_reg(qdev,
- &port_regs->CommonRegs.
- ispControlStatus);
- if ((value & ISP_CONTROL_FSR) == 0) {
- break;
- }
- ssleep(1);
- } while ((--max_wait_time));
- }
- if (max_wait_time == 0)
- status = 1;
-
- clear_bit(QL_RESET_ACTIVE, &qdev->flags);
- set_bit(QL_RESET_DONE, &qdev->flags);
- return status;
-}
-
-static void ql_set_mac_info(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- u32 value, port_status;
- u8 func_number;
-
- /* Get the function number */
- value =
- ql_read_common_reg_l(qdev, &port_regs->CommonRegs.ispControlStatus);
- func_number = (u8) ((value >> 4) & OPCODE_FUNC_ID_MASK);
- port_status = ql_read_page0_reg(qdev, &port_regs->portStatus);
- switch (value & ISP_CONTROL_FN_MASK) {
- case ISP_CONTROL_FN0_NET:
- qdev->mac_index = 0;
- qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
- qdev->tcp_ob_opcode = OUTBOUND_TCP_IOCB | func_number;
- qdev->update_ob_opcode = UPDATE_NCB_IOCB | func_number;
- qdev->mb_bit_mask = FN0_MA_BITS_MASK;
- qdev->PHYAddr = PORT0_PHY_ADDRESS;
- if (port_status & PORT_STATUS_SM0)
- set_bit(QL_LINK_OPTICAL,&qdev->flags);
- else
- clear_bit(QL_LINK_OPTICAL,&qdev->flags);
- break;
-
- case ISP_CONTROL_FN1_NET:
- qdev->mac_index = 1;
- qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
- qdev->tcp_ob_opcode = OUTBOUND_TCP_IOCB | func_number;
- qdev->update_ob_opcode = UPDATE_NCB_IOCB | func_number;
- qdev->mb_bit_mask = FN1_MA_BITS_MASK;
- qdev->PHYAddr = PORT1_PHY_ADDRESS;
- if (port_status & PORT_STATUS_SM1)
- set_bit(QL_LINK_OPTICAL,&qdev->flags);
- else
- clear_bit(QL_LINK_OPTICAL,&qdev->flags);
- break;
-
- case ISP_CONTROL_FN0_SCSI:
- case ISP_CONTROL_FN1_SCSI:
- default:
- printk(KERN_DEBUG PFX
- "%s: Invalid function number, ispControlStatus = 0x%x\n",
- qdev->ndev->name,value);
- break;
- }
- qdev->numPorts = qdev->nvram_data.numPorts;
-}
-
-static void ql_display_dev_info(struct net_device *ndev)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)netdev_priv(ndev);
- struct pci_dev *pdev = qdev->pdev;
-
- printk(KERN_INFO PFX
- "\n%s Adapter %d RevisionID %d found on PCI slot %d.\n",
- DRV_NAME, qdev->index, qdev->chip_rev_id, qdev->pci_slot);
- printk(KERN_INFO PFX
- "%s Interface.\n",
- test_bit(QL_LINK_OPTICAL,&qdev->flags) ? "OPTICAL" : "COPPER");
-
- /*
- * Print PCI bus width/type.
- */
- printk(KERN_INFO PFX
- "Bus interface is %s %s.\n",
- ((qdev->pci_width == 64) ? "64-bit" : "32-bit"),
- ((qdev->pci_x) ? "PCI-X" : "PCI"));
-
- printk(KERN_INFO PFX
- "mem IO base address adjusted = 0x%p\n",
- qdev->mem_map_registers);
- printk(KERN_INFO PFX "Interrupt number = %d\n", pdev->irq);
-
- if (netif_msg_probe(qdev))
- printk(KERN_INFO PFX
- "%s: MAC address %02x:%02x:%02x:%02x:%02x:%02x\n",
- ndev->name, ndev->dev_addr[0], ndev->dev_addr[1],
- ndev->dev_addr[2], ndev->dev_addr[3], ndev->dev_addr[4],
- ndev->dev_addr[5]);
-}
-
-static int ql_adapter_down(struct ql3_adapter *qdev, int do_reset)
-{
- struct net_device *ndev = qdev->ndev;
- int retval = 0;
-
- netif_stop_queue(ndev);
- netif_carrier_off(ndev);
-
- clear_bit(QL_ADAPTER_UP,&qdev->flags);
- clear_bit(QL_LINK_MASTER,&qdev->flags);
-
- ql_disable_interrupts(qdev);
-
- free_irq(qdev->pdev->irq, ndev);
-
- if (qdev->msi && test_bit(QL_MSI_ENABLED,&qdev->flags)) {
- printk(KERN_INFO PFX
- "%s: calling pci_disable_msi().\n", qdev->ndev->name);
- clear_bit(QL_MSI_ENABLED,&qdev->flags);
- pci_disable_msi(qdev->pdev);
- }
-
- del_timer_sync(&qdev->adapter_timer);
-
- netif_poll_disable(ndev);
-
- if (do_reset) {
- int soft_reset;
- unsigned long hw_flags;
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- if (ql_wait_for_drvr_lock(qdev)) {
- if ((soft_reset = ql_adapter_reset(qdev))) {
- printk(KERN_ERR PFX
- "%s: ql_adapter_reset(%d) FAILED!\n",
- ndev->name, qdev->index);
- }
- printk(KERN_ERR PFX
- "%s: Releaseing driver lock via chip reset.\n",ndev->name);
- } else {
- printk(KERN_ERR PFX
- "%s: Could not acquire driver lock to do "
- "reset!\n", ndev->name);
- retval = -1;
- }
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
- }
- ql_free_mem_resources(qdev);
- return retval;
-}
-
-static int ql_adapter_up(struct ql3_adapter *qdev)
-{
- struct net_device *ndev = qdev->ndev;
- int err;
- unsigned long irq_flags = SA_SAMPLE_RANDOM | SA_SHIRQ;
- unsigned long hw_flags;
-
- if (ql_alloc_mem_resources(qdev)) {
- printk(KERN_ERR PFX
- "%s Unable to allocate buffers.\n", ndev->name);
- return -ENOMEM;
- }
-
- if (qdev->msi) {
- if (pci_enable_msi(qdev->pdev)) {
- printk(KERN_ERR PFX
- "%s: User requested MSI, but MSI failed to "
- "initialize. Continuing without MSI.\n",
- qdev->ndev->name);
- qdev->msi = 0;
- } else {
- printk(KERN_INFO PFX "%s: MSI Enabled...\n", qdev->ndev->name);
- set_bit(QL_MSI_ENABLED,&qdev->flags);
- irq_flags &= ~SA_SHIRQ;
- }
- }
-
- if ((err = request_irq(qdev->pdev->irq,
- ql3xxx_isr,
- irq_flags, ndev->name, ndev))) {
- printk(KERN_ERR PFX
- "%s: Failed to reserve interrupt %d already in use.\n",
- ndev->name, qdev->pdev->irq);
- goto err_irq;
- }
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
-
- if ((err = ql_wait_for_drvr_lock(qdev))) {
- if ((err = ql_adapter_initialize(qdev))) {
- printk(KERN_ERR PFX
- "%s: Unable to initialize adapter.\n",
- ndev->name);
- goto err_init;
- }
- printk(KERN_ERR PFX
- "%s: Releaseing driver lock.\n",ndev->name);
- ql_sem_unlock(qdev, QL_DRVR_SEM_MASK);
- } else {
- printk(KERN_ERR PFX
- "%s: Could not aquire driver lock.\n",
- ndev->name);
- goto err_lock;
- }
-
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-
- set_bit(QL_ADAPTER_UP,&qdev->flags);
-
- mod_timer(&qdev->adapter_timer, jiffies + HZ * 1);
-
- netif_poll_enable(ndev);
- ql_enable_interrupts(qdev);
- return 0;
-
-err_init:
- ql_sem_unlock(qdev, QL_DRVR_SEM_MASK);
-err_lock:
- free_irq(qdev->pdev->irq, ndev);
-err_irq:
- if (qdev->msi && test_bit(QL_MSI_ENABLED,&qdev->flags)) {
- printk(KERN_INFO PFX
- "%s: calling pci_disable_msi().\n",
- qdev->ndev->name);
- clear_bit(QL_MSI_ENABLED,&qdev->flags);
- pci_disable_msi(qdev->pdev);
- }
- return err;
-}
-
-static int ql_cycle_adapter(struct ql3_adapter *qdev, int reset)
-{
- if( ql_adapter_down(qdev,reset) || ql_adapter_up(qdev)) {
- printk(KERN_ERR PFX
- "%s: Driver up/down cycle failed, "
- "closing device\n",qdev->ndev->name);
- dev_close(qdev->ndev);
- return -1;
- }
- return 0;
-}
-
-static int ql3xxx_close(struct net_device *ndev)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
-
- /*
- * Wait for device to recover from a reset.
- * (Rarely happens, but possible.)
- */
- while (!test_bit(QL_ADAPTER_UP,&qdev->flags))
- msleep(50);
-
- ql_adapter_down(qdev,QL_DO_RESET);
- return 0;
-}
-
-static int ql3xxx_open(struct net_device *ndev)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- return (ql_adapter_up(qdev));
-}
-
-static struct net_device_stats *ql3xxx_get_stats(struct net_device *dev)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)dev->priv;
- return &qdev->stats;
-}
-
-static int ql3xxx_change_mtu(struct net_device *ndev, int new_mtu)
-{
- struct ql3_adapter *qdev = netdev_priv(ndev);
- printk(KERN_ERR PFX "%s: new mtu size = %d.\n", ndev->name, new_mtu);
- if (new_mtu != NORMAL_MTU_SIZE && new_mtu != JUMBO_MTU_SIZE) {
- printk(KERN_ERR PFX
- "%s: mtu size of %d is not valid. Use exactly %d or "
- "%d.\n", ndev->name, new_mtu, NORMAL_MTU_SIZE,
- JUMBO_MTU_SIZE);
- return -EINVAL;
- }
-
- if (!netif_running(ndev)) {
- ndev->mtu = new_mtu;
- return 0;
- }
-
- ndev->mtu = new_mtu;
- return ql_cycle_adapter(qdev,QL_DO_RESET);
-}
-
-static void ql3xxx_set_multicast_list(struct net_device *ndev)
-{
- /*
- * We are manually parsing the list in the net_device structure.
- */
- return;
-}
-
-static int ql3xxx_set_mac_address(struct net_device *ndev, void *p)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)netdev_priv(ndev);
- struct ql3xxx_port_registers __iomem *port_regs =
- qdev->mem_map_registers;
- struct sockaddr *addr = p;
- unsigned long hw_flags;
-
- if (netif_running(ndev))
- return -EBUSY;
-
- if (!is_valid_ether_addr(addr->sa_data))
- return -EADDRNOTAVAIL;
-
- memcpy(ndev->dev_addr, addr->sa_data, ndev->addr_len);
-
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- /* Program lower 32 bits of the MAC address */
- ql_write_page0_reg(qdev, &port_regs->macAddrIndirectPtrReg,
- (MAC_ADDR_INDIRECT_PTR_REG_RP_MASK << 16));
- ql_write_page0_reg(qdev, &port_regs->macAddrDataReg,
- ((ndev->dev_addr[2] << 24) | (ndev->
- dev_addr[3] << 16) |
- (ndev->dev_addr[4] << 8) | ndev->dev_addr[5]));
-
- /* Program top 16 bits of the MAC address */
- ql_write_page0_reg(qdev, &port_regs->macAddrIndirectPtrReg,
- ((MAC_ADDR_INDIRECT_PTR_REG_RP_MASK << 16) | 1));
- ql_write_page0_reg(qdev, &port_regs->macAddrDataReg,
- ((ndev->dev_addr[0] << 8) | ndev->dev_addr[1]));
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-
- return 0;
-}
-
-static void ql3xxx_tx_timeout(struct net_device *ndev)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)netdev_priv(ndev);
-
- printk(KERN_ERR PFX "%s: Resetting...\n", ndev->name);
- /*
- * Stop the queues, we've got a problem.
- */
- netif_stop_queue(ndev);
-
- /*
- * Wake up the worker to process this event.
- */
- queue_work(qdev->workqueue, &qdev->tx_timeout_work);
-}
-
-static void ql_reset_work(struct ql3_adapter *qdev)
-{
- struct net_device *ndev = qdev->ndev;
- u32 value;
- struct ql_tx_buf_cb *tx_cb;
- int max_wait_time, i;
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- unsigned long hw_flags;
-
- if (test_bit((QL_RESET_PER_SCSI | QL_RESET_START),&qdev->flags)) {
- clear_bit(QL_LINK_MASTER,&qdev->flags);
-
- /*
- * Loop through the active list and return the skb.
- */
- for (i = 0; i < NUM_REQ_Q_ENTRIES; i++) {
- tx_cb = &qdev->tx_buf[i];
- if (tx_cb->skb) {
-
- printk(KERN_DEBUG PFX
- "%s: Freeing lost SKB.\n",
- qdev->ndev->name);
- pci_unmap_single(qdev->pdev,
- pci_unmap_addr(tx_cb, mapaddr),
- pci_unmap_len(tx_cb, maplen), PCI_DMA_TODEVICE);
- dev_kfree_skb(tx_cb->skb);
- tx_cb->skb = NULL;
- }
- }
-
- printk(KERN_ERR PFX
- "%s: Clearing NRI after reset.\n", qdev->ndev->name);
- spin_lock_irqsave(&qdev->hw_lock, hw_flags);
- ql_write_common_reg(qdev,
- &port_regs->CommonRegs.
- ispControlStatus,
- ((ISP_CONTROL_RI << 16) | ISP_CONTROL_RI));
- /*
- * Wait the for Soft Reset to Complete.
- */
- max_wait_time = 10;
- do {
- value = ql_read_common_reg(qdev,
- &port_regs->CommonRegs.
-
- ispControlStatus);
- if ((value & ISP_CONTROL_SR) == 0) {
- printk(KERN_DEBUG PFX
- "%s: reset completed.\n",
- qdev->ndev->name);
- break;
- }
-
- if (value & ISP_CONTROL_RI) {
- printk(KERN_DEBUG PFX
- "%s: clearing NRI after reset.\n",
- qdev->ndev->name);
- ql_write_common_reg(qdev,
- (u32 *) &
- port_regs->
- CommonRegs.
- ispControlStatus,
- ((ISP_CONTROL_RI <<
- 16) | ISP_CONTROL_RI));
- }
-
- ssleep(1);
- } while (--max_wait_time);
- spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
-
- if (value & ISP_CONTROL_SR) {
-
- /*
- * Set the reset flags and clear the board again.
- * Nothing else to do...
- */
- printk(KERN_ERR PFX
- "%s: Timed out waiting for reset to "
- "complete.\n", ndev->name);
- printk(KERN_ERR PFX
- "%s: Do a reset.\n", ndev->name);
- clear_bit(QL_RESET_PER_SCSI,&qdev->flags);
- clear_bit(QL_RESET_START,&qdev->flags);
- ql_cycle_adapter(qdev,QL_DO_RESET);
- return;
- }
-
- clear_bit(QL_RESET_ACTIVE,&qdev->flags);
- clear_bit(QL_RESET_PER_SCSI,&qdev->flags);
- clear_bit(QL_RESET_START,&qdev->flags);
- ql_cycle_adapter(qdev,QL_NO_RESET);
- }
-}
-
-static void ql_tx_timeout_work(struct ql3_adapter *qdev)
-{
- ql_cycle_adapter(qdev,QL_DO_RESET);
-}
-
-static void ql_get_board_info(struct ql3_adapter *qdev)
-{
- struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers;
- u32 value;
-
- value = ql_read_page0_reg_l(qdev, &port_regs->portStatus);
-
- qdev->chip_rev_id = ((value & PORT_STATUS_REV_ID_MASK) >> 12);
- if (value & PORT_STATUS_64)
- qdev->pci_width = 64;
- else
- qdev->pci_width = 32;
- if (value & PORT_STATUS_X)
- qdev->pci_x = 1;
- else
- qdev->pci_x = 0;
- qdev->pci_slot = (u8) PCI_SLOT(qdev->pdev->devfn);
-}
-
-static void ql3xxx_timer(unsigned long ptr)
-{
- struct ql3_adapter *qdev = (struct ql3_adapter *)ptr;
-
- if (test_bit(QL_RESET_ACTIVE,&qdev->flags)) {
- printk(KERN_DEBUG PFX
- "%s: Reset in progress.\n",
- qdev->ndev->name);
- goto end;
- }
-
- ql_link_state_machine(qdev);
-
- /* Restart timer on 2 second interval. */
-end:
- mod_timer(&qdev->adapter_timer, jiffies + HZ * 1);
-}
-
-static int __devinit ql3xxx_probe(struct pci_dev *pdev,
- const struct pci_device_id *pci_entry)
-{
- struct net_device *ndev = NULL;
- struct ql3_adapter *qdev = NULL;
- static int cards_found = 0;
- int pci_using_dac, err;
-
- err = pci_enable_device(pdev);
- if (err) {
- printk(KERN_ERR PFX "%s cannot enable PCI device\n",
- pci_name(pdev));
- goto err_out;
- }
-
- err = pci_request_regions(pdev, DRV_NAME);
- if (err) {
- printk(KERN_ERR PFX "%s cannot obtain PCI resources\n",
- pci_name(pdev));
- goto err_out_disable_pdev;
- }
-
- pci_set_master(pdev);
-
- if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
- pci_using_dac = 1;
- err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
- } else if (!(err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) {
- pci_using_dac = 0;
- err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
- }
-
- if (err) {
- printk(KERN_ERR PFX "%s no usable DMA configuration\n",
- pci_name(pdev));
- goto err_out_free_regions;
- }
-
- ndev = alloc_etherdev(sizeof(struct ql3_adapter));
- if (!ndev)
- goto err_out_free_regions;
-
- SET_MODULE_OWNER(ndev);
- SET_NETDEV_DEV(ndev, &pdev->dev);
-
- ndev->features = NETIF_F_LLTX;
- if (pci_using_dac)
- ndev->features |= NETIF_F_HIGHDMA;
-
- pci_set_drvdata(pdev, ndev);
-
- qdev = netdev_priv(ndev);
- qdev->index = cards_found;
- qdev->ndev = ndev;
- qdev->pdev = pdev;
- qdev->port_link_state = LS_DOWN;
- if (msi)
- qdev->msi = 1;
-
- qdev->msg_enable = netif_msg_init(debug, default_msg);
-
- qdev->mem_map_registers =
- ioremap_nocache(pci_resource_start(pdev, 1),
- pci_resource_len(qdev->pdev, 1));
- if (!qdev->mem_map_registers) {
- printk(KERN_ERR PFX "%s: cannot map device registers\n",
- pci_name(pdev));
- goto err_out_free_ndev;
- }
-
- spin_lock_init(&qdev->adapter_lock);
- spin_lock_init(&qdev->hw_lock);
-
- /* Set driver entry points */
- ndev->open = ql3xxx_open;
- ndev->hard_start_xmit = ql3xxx_send;
- ndev->stop = ql3xxx_close;
- ndev->get_stats = ql3xxx_get_stats;
- ndev->change_mtu = ql3xxx_change_mtu;
- ndev->set_multicast_list = ql3xxx_set_multicast_list;
- SET_ETHTOOL_OPS(ndev, &ql3xxx_ethtool_ops);
- ndev->set_mac_address = ql3xxx_set_mac_address;
- ndev->tx_timeout = ql3xxx_tx_timeout;
- ndev->watchdog_timeo = 5 * HZ;
-
- ndev->poll = &ql_poll;
- ndev->weight = 64;
-
- ndev->irq = pdev->irq;
-
- /* make sure the EEPROM is good */
- if (ql_get_nvram_params(qdev)) {
- printk(KERN_ALERT PFX
- "ql3xxx_probe: Adapter #%d, Invalid NVRAM parameters.\n",
- qdev->index);
- goto err_out_iounmap;
- }
-
- ql_set_mac_info(qdev);
-
- /* Validate and set parameters */
- if (qdev->mac_index) {
- memcpy(ndev->dev_addr, &qdev->nvram_data.funcCfg_fn2.macAddress,
- ETH_ALEN);
- } else {
- memcpy(ndev->dev_addr, &qdev->nvram_data.funcCfg_fn0.macAddress,
- ETH_ALEN);
- }
- memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len);
-
- ndev->tx_queue_len = NUM_REQ_Q_ENTRIES;
-
- /* Turn off support for multicasting */
- ndev->flags &= ~IFF_MULTICAST;
-
- /* Record PCI bus information. */
- ql_get_board_info(qdev);
-
- /*
- * Set the Maximum Memory Read Byte Count value. We do this to handle
- * jumbo frames.
- */
- if (qdev->pci_x) {
- pci_write_config_word(pdev, (int)0x4e, (u16) 0x0036);
- }
-
- err = register_netdev(ndev);
- if (err) {
- printk(KERN_ERR PFX "%s: cannot register net device\n",
- pci_name(pdev));
- goto err_out_iounmap;
- }
-
- /* we're going to reset, so assume we have no link for now */
-
- netif_carrier_off(ndev);
- netif_stop_queue(ndev);
-
- qdev->workqueue = create_singlethread_workqueue(ndev->name);
- INIT_WORK(&qdev->reset_work, (void (*)(void *))ql_reset_work, qdev);
- INIT_WORK(&qdev->tx_timeout_work,
- (void (*)(void *))ql_tx_timeout_work, qdev);
-
- init_timer(&qdev->adapter_timer);
- qdev->adapter_timer.function = ql3xxx_timer;
- qdev->adapter_timer.expires = jiffies + HZ * 2; /* two second delay */
- qdev->adapter_timer.data = (unsigned long)qdev;
-
- if(!cards_found) {
- printk(KERN_ALERT PFX "%s\n", DRV_STRING);
- printk(KERN_ALERT PFX "Driver name: %s, Version: %s.\n",
- DRV_NAME, DRV_VERSION);
- }
- ql_display_dev_info(ndev);
-
- cards_found++;
- return 0;
-
-err_out_iounmap:
- iounmap(qdev->mem_map_registers);
-err_out_free_ndev:
- free_netdev(ndev);
-err_out_free_regions:
- pci_release_regions(pdev);
-err_out_disable_pdev:
- pci_disable_device(pdev);
- pci_set_drvdata(pdev, NULL);
-err_out:
- return err;
-}
-
-static void __devexit ql3xxx_remove(struct pci_dev *pdev)
-{
- struct net_device *ndev = pci_get_drvdata(pdev);
- struct ql3_adapter *qdev = netdev_priv(ndev);
-
- unregister_netdev(ndev);
- qdev = netdev_priv(ndev);
-
- ql_disable_interrupts(qdev);
-
- if (qdev->workqueue) {
- cancel_delayed_work(&qdev->reset_work);
- cancel_delayed_work(&qdev->tx_timeout_work);
- destroy_workqueue(qdev->workqueue);
- qdev->workqueue = NULL;
- }
-
- iounmap((void *)qdev->mmap_virt_base);
- pci_release_regions(pdev);
- pci_set_drvdata(pdev, NULL);
- free_netdev(ndev);
-}
-
-static struct pci_driver ql3xxx_driver = {
-
- .name = DRV_NAME,
- .id_table = ql3xxx_pci_tbl,
- .probe = ql3xxx_probe,
- .remove = __devexit_p(ql3xxx_remove),
-};
-
-static int __init ql3xxx_init_module(void)
-{
- return pci_register_driver(&ql3xxx_driver);
-}
-
-static void __exit ql3xxx_exit(void)
-{
- pci_unregister_driver(&ql3xxx_driver);
-}
-
-module_init(ql3xxx_init_module);
-module_exit(ql3xxx_exit);
diff --git a/trunk/drivers/net/qla3xxx.h b/trunk/drivers/net/qla3xxx.h
deleted file mode 100644
index 9492cee6b083..000000000000
--- a/trunk/drivers/net/qla3xxx.h
+++ /dev/null
@@ -1,1194 +0,0 @@
-/*
- * QLogic QLA3xxx NIC HBA Driver
- * Copyright (c) 2003-2006 QLogic Corporation
- *
- * See LICENSE.qla3xxx for copyright and licensing details.
- */
-#ifndef _QLA3XXX_H_
-#define _QLA3XXX_H_
-
-/*
- * IOCB Definitions...
- */
-#pragma pack(1)
-
-#define OPCODE_OB_MAC_IOCB_FN0 0x01
-#define OPCODE_OB_MAC_IOCB_FN2 0x21
-#define OPCODE_OB_TCP_IOCB_FN0 0x03
-#define OPCODE_OB_TCP_IOCB_FN2 0x23
-#define OPCODE_UPDATE_NCB_IOCB_FN0 0x00
-#define OPCODE_UPDATE_NCB_IOCB_FN2 0x20
-
-#define OPCODE_UPDATE_NCB_IOCB 0xF0
-#define OPCODE_IB_MAC_IOCB 0xF9
-#define OPCODE_IB_IP_IOCB 0xFA
-#define OPCODE_IB_TCP_IOCB 0xFB
-#define OPCODE_DUMP_PROTO_IOCB 0xFE
-#define OPCODE_BUFFER_ALERT_IOCB 0xFB
-
-#define OPCODE_FUNC_ID_MASK 0x30
-#define OUTBOUND_MAC_IOCB 0x01 /* plus function bits */
-#define OUTBOUND_TCP_IOCB 0x03 /* plus function bits */
-#define UPDATE_NCB_IOCB 0x00 /* plus function bits */
-
-#define FN0_MA_BITS_MASK 0x00
-#define FN1_MA_BITS_MASK 0x80
-
-struct ob_mac_iocb_req {
- u8 opcode;
- u8 flags;
-#define OB_MAC_IOCB_REQ_MA 0xC0
-#define OB_MAC_IOCB_REQ_F 0x20
-#define OB_MAC_IOCB_REQ_X 0x10
-#define OB_MAC_IOCB_REQ_D 0x02
-#define OB_MAC_IOCB_REQ_I 0x01
- __le16 reserved0;
-
- __le32 transaction_id;
- __le16 data_len;
- __le16 reserved1;
- __le32 reserved2;
- __le32 reserved3;
- __le32 buf_addr0_low;
- __le32 buf_addr0_high;
- __le32 buf_0_len;
- __le32 buf_addr1_low;
- __le32 buf_addr1_high;
- __le32 buf_1_len;
- __le32 buf_addr2_low;
- __le32 buf_addr2_high;
- __le32 buf_2_len;
- __le32 reserved4;
- __le32 reserved5;
-};
-/*
- * The following constants define control bits for buffer
- * length fields for all IOCB's.
- */
-#define OB_MAC_IOCB_REQ_E 0x80000000 /* Last valid buffer in list. */
-#define OB_MAC_IOCB_REQ_C 0x40000000 /* points to an OAL. (continuation) */
-#define OB_MAC_IOCB_REQ_L 0x20000000 /* Auburn local address pointer. */
-#define OB_MAC_IOCB_REQ_R 0x10000000 /* 32-bit address pointer. */
-
-struct ob_mac_iocb_rsp {
- u8 opcode;
- u8 flags;
-#define OB_MAC_IOCB_RSP_P 0x08
-#define OB_MAC_IOCB_RSP_S 0x02
-#define OB_MAC_IOCB_RSP_I 0x01
-
- __le16 reserved0;
- __le32 transaction_id;
- __le32 reserved1;
- __le32 reserved2;
-};
-
-struct ib_mac_iocb_rsp {
- u8 opcode;
- u8 flags;
-#define IB_MAC_IOCB_RSP_S 0x80
-#define IB_MAC_IOCB_RSP_H1 0x40
-#define IB_MAC_IOCB_RSP_H0 0x20
-#define IB_MAC_IOCB_RSP_B 0x10
-#define IB_MAC_IOCB_RSP_M 0x08
-#define IB_MAC_IOCB_RSP_MA 0x07
-
- __le16 length;
- __le32 reserved;
- __le32 ial_low;
- __le32 ial_high;
-
-};
-
-struct ob_ip_iocb_req {
- u8 opcode;
- __le16 flags;
-#define OB_IP_IOCB_REQ_O 0x100
-#define OB_IP_IOCB_REQ_H 0x008
-#define OB_IP_IOCB_REQ_U 0x004
-#define OB_IP_IOCB_REQ_D 0x002
-#define OB_IP_IOCB_REQ_I 0x001
-
- u8 reserved0;
-
- __le32 transaction_id;
- __le16 data_len;
- __le16 reserved1;
- __le32 hncb_ptr_low;
- __le32 hncb_ptr_high;
- __le32 buf_addr0_low;
- __le32 buf_addr0_high;
- __le32 buf_0_len;
- __le32 buf_addr1_low;
- __le32 buf_addr1_high;
- __le32 buf_1_len;
- __le32 buf_addr2_low;
- __le32 buf_addr2_high;
- __le32 buf_2_len;
- __le32 reserved2;
- __le32 reserved3;
-};
-
-/* defines for BufferLength fields above */
-#define OB_IP_IOCB_REQ_E 0x80000000
-#define OB_IP_IOCB_REQ_C 0x40000000
-#define OB_IP_IOCB_REQ_L 0x20000000
-#define OB_IP_IOCB_REQ_R 0x10000000
-
-struct ob_ip_iocb_rsp {
- u8 opcode;
- u8 flags;
-#define OB_MAC_IOCB_RSP_E 0x08
-#define OB_MAC_IOCB_RSP_L 0x04
-#define OB_MAC_IOCB_RSP_S 0x02
-#define OB_MAC_IOCB_RSP_I 0x01
-
- __le16 reserved0;
- __le32 transaction_id;
- __le32 reserved1;
- __le32 reserved2;
-};
-
-struct ob_tcp_iocb_req {
- u8 opcode;
-
- u8 flags0;
-#define OB_TCP_IOCB_REQ_P 0x80
-#define OB_TCP_IOCB_REQ_CI 0x20
-#define OB_TCP_IOCB_REQ_H 0x10
-#define OB_TCP_IOCB_REQ_LN 0x08
-#define OB_TCP_IOCB_REQ_K 0x04
-#define OB_TCP_IOCB_REQ_D 0x02
-#define OB_TCP_IOCB_REQ_I 0x01
-
- u8 flags1;
-#define OB_TCP_IOCB_REQ_OSM 0x40
-#define OB_TCP_IOCB_REQ_URG 0x20
-#define OB_TCP_IOCB_REQ_ACK 0x10
-#define OB_TCP_IOCB_REQ_PSH 0x08
-#define OB_TCP_IOCB_REQ_RST 0x04
-#define OB_TCP_IOCB_REQ_SYN 0x02
-#define OB_TCP_IOCB_REQ_FIN 0x01
-
- u8 options_len;
-#define OB_TCP_IOCB_REQ_OMASK 0xF0
-#define OB_TCP_IOCB_REQ_SHIFT 4
-
- __le32 transaction_id;
- __le32 data_len;
- __le32 hncb_ptr_low;
- __le32 hncb_ptr_high;
- __le32 buf_addr0_low;
- __le32 buf_addr0_high;
- __le32 buf_0_len;
- __le32 buf_addr1_low;
- __le32 buf_addr1_high;
- __le32 buf_1_len;
- __le32 buf_addr2_low;
- __le32 buf_addr2_high;
- __le32 buf_2_len;
- __le32 time_stamp;
- __le32 reserved1;
-};
-
-struct ob_tcp_iocb_rsp {
- u8 opcode;
-
- u8 flags0;
-#define OB_TCP_IOCB_RSP_C 0x20
-#define OB_TCP_IOCB_RSP_H 0x10
-#define OB_TCP_IOCB_RSP_LN 0x08
-#define OB_TCP_IOCB_RSP_K 0x04
-#define OB_TCP_IOCB_RSP_D 0x02
-#define OB_TCP_IOCB_RSP_I 0x01
-
- u8 flags1;
-#define OB_TCP_IOCB_RSP_E 0x10
-#define OB_TCP_IOCB_RSP_W 0x08
-#define OB_TCP_IOCB_RSP_P 0x04
-#define OB_TCP_IOCB_RSP_T 0x02
-#define OB_TCP_IOCB_RSP_F 0x01
-
- u8 state;
-#define OB_TCP_IOCB_RSP_SMASK 0xF0
-#define OB_TCP_IOCB_RSP_SHIFT 4
-
- __le32 transaction_id;
- __le32 local_ncb_ptr;
- __le32 reserved0;
-};
-
-struct ib_ip_iocb_rsp {
- u8 opcode;
- u8 flags;
-#define IB_IP_IOCB_RSP_S 0x80
-#define IB_IP_IOCB_RSP_H1 0x40
-#define IB_IP_IOCB_RSP_H0 0x20
-#define IB_IP_IOCB_RSP_B 0x10
-#define IB_IP_IOCB_RSP_M 0x08
-#define IB_IP_IOCB_RSP_MA 0x07
-
- __le16 length;
- __le16 checksum;
- __le16 reserved;
-#define IB_IP_IOCB_RSP_R 0x01
- __le32 ial_low;
- __le32 ial_high;
-};
-
-struct ib_tcp_iocb_rsp {
- u8 opcode;
- u8 flags;
-#define IB_TCP_IOCB_RSP_P 0x80
-#define IB_TCP_IOCB_RSP_T 0x40
-#define IB_TCP_IOCB_RSP_D 0x20
-#define IB_TCP_IOCB_RSP_N 0x10
-#define IB_TCP_IOCB_RSP_IP 0x03
-#define IB_TCP_FLAG_MASK 0xf0
-#define IB_TCP_FLAG_IOCB_SYN 0x00
-
-#define TCP_IB_RSP_FLAGS(x) (x->flags & ~IB_TCP_FLAG_MASK)
-
- __le16 length;
- __le32 hncb_ref_num;
- __le32 ial_low;
- __le32 ial_high;
-};
-
-struct net_rsp_iocb {
- u8 opcode;
- u8 flags;
- __le16 reserved0;
- __le32 reserved[3];
-};
-#pragma pack()
-
-/*
- * Register Definitions...
- */
-#define PORT0_PHY_ADDRESS 0x1e00
-#define PORT1_PHY_ADDRESS 0x1f00
-
-#define ETHERNET_CRC_SIZE 4
-
-#define MII_SCAN_REGISTER 0x00000001
-
-/* 32-bit ispControlStatus */
-enum {
- ISP_CONTROL_NP_MASK = 0x0003,
- ISP_CONTROL_NP_PCSR = 0x0000,
- ISP_CONTROL_NP_HMCR = 0x0001,
- ISP_CONTROL_NP_LRAMCR = 0x0002,
- ISP_CONTROL_NP_PSR = 0x0003,
- ISP_CONTROL_RI = 0x0008,
- ISP_CONTROL_CI = 0x0010,
- ISP_CONTROL_PI = 0x0020,
- ISP_CONTROL_IN = 0x0040,
- ISP_CONTROL_BE = 0x0080,
- ISP_CONTROL_FN_MASK = 0x0700,
- ISP_CONTROL_FN0_NET = 0x0400,
- ISP_CONTROL_FN0_SCSI = 0x0500,
- ISP_CONTROL_FN1_NET = 0x0600,
- ISP_CONTROL_FN1_SCSI = 0x0700,
- ISP_CONTROL_LINK_DN_0 = 0x0800,
- ISP_CONTROL_LINK_DN_1 = 0x1000,
- ISP_CONTROL_FSR = 0x2000,
- ISP_CONTROL_FE = 0x4000,
- ISP_CONTROL_SR = 0x8000,
-};
-
-/* 32-bit ispInterruptMaskReg */
-enum {
- ISP_IMR_ENABLE_INT = 0x0004,
- ISP_IMR_DISABLE_RESET_INT = 0x0008,
- ISP_IMR_DISABLE_CMPL_INT = 0x0010,
- ISP_IMR_DISABLE_PROC_INT = 0x0020,
-};
-
-/* 32-bit serialPortInterfaceReg */
-enum {
- ISP_SERIAL_PORT_IF_CLK = 0x0001,
- ISP_SERIAL_PORT_IF_CS = 0x0002,
- ISP_SERIAL_PORT_IF_D0 = 0x0004,
- ISP_SERIAL_PORT_IF_DI = 0x0008,
- ISP_NVRAM_MASK = (0x000F << 16),
- ISP_SERIAL_PORT_IF_WE = 0x0010,
- ISP_SERIAL_PORT_IF_NVR_MASK = 0x001F,
- ISP_SERIAL_PORT_IF_SCI = 0x0400,
- ISP_SERIAL_PORT_IF_SC0 = 0x0800,
- ISP_SERIAL_PORT_IF_SCE = 0x1000,
- ISP_SERIAL_PORT_IF_SDI = 0x2000,
- ISP_SERIAL_PORT_IF_SDO = 0x4000,
- ISP_SERIAL_PORT_IF_SDE = 0x8000,
- ISP_SERIAL_PORT_IF_I2C_MASK = 0xFC00,
-};
-
-/* semaphoreReg */
-enum {
- QL_RESOURCE_MASK_BASE_CODE = 0x7,
- QL_RESOURCE_BITS_BASE_CODE = 0x4,
- QL_DRVR_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 1),
- QL_DDR_RAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 4),
- QL_PHY_GIO_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 7),
- QL_NVRAM_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 10),
- QL_FLASH_SEM_BITS = (QL_RESOURCE_BITS_BASE_CODE << 13),
- QL_DRVR_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (1 + 16)),
- QL_DDR_RAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (4 + 16)),
- QL_PHY_GIO_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (7 + 16)),
- QL_NVRAM_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (10 + 16)),
- QL_FLASH_SEM_MASK = (QL_RESOURCE_MASK_BASE_CODE << (13 + 16)),
-};
-
- /*
- * QL3XXX memory-mapped registers
- * QL3XXX has 4 "pages" of registers, each page occupying
- * 256 bytes. Each page has a "common" area at the start and then
- * page-specific registers after that.
- */
-struct ql3xxx_common_registers {
- u32 MB0; /* Offset 0x00 */
- u32 MB1; /* Offset 0x04 */
- u32 MB2; /* Offset 0x08 */
- u32 MB3; /* Offset 0x0c */
- u32 MB4; /* Offset 0x10 */
- u32 MB5; /* Offset 0x14 */
- u32 MB6; /* Offset 0x18 */
- u32 MB7; /* Offset 0x1c */
- u32 flashBiosAddr;
- u32 flashBiosData;
- u32 ispControlStatus;
- u32 ispInterruptMaskReg;
- u32 serialPortInterfaceReg;
- u32 semaphoreReg;
- u32 reqQProducerIndex;
- u32 rspQConsumerIndex;
-
- u32 rxLargeQProducerIndex;
- u32 rxSmallQProducerIndex;
- u32 arcMadiCommand;
- u32 arcMadiData;
-};
-
-enum {
- EXT_HW_CONFIG_SP_MASK = 0x0006,
- EXT_HW_CONFIG_SP_NONE = 0x0000,
- EXT_HW_CONFIG_SP_BYTE_PARITY = 0x0002,
- EXT_HW_CONFIG_SP_ECC = 0x0004,
- EXT_HW_CONFIG_SP_ECCx = 0x0006,
- EXT_HW_CONFIG_SIZE_MASK = 0x0060,
- EXT_HW_CONFIG_SIZE_128M = 0x0000,
- EXT_HW_CONFIG_SIZE_256M = 0x0020,
- EXT_HW_CONFIG_SIZE_512M = 0x0040,
- EXT_HW_CONFIG_SIZE_INVALID = 0x0060,
- EXT_HW_CONFIG_PD = 0x0080,
- EXT_HW_CONFIG_FW = 0x0200,
- EXT_HW_CONFIG_US = 0x0400,
- EXT_HW_CONFIG_DCS_MASK = 0x1800,
- EXT_HW_CONFIG_DCS_9MA = 0x0000,
- EXT_HW_CONFIG_DCS_15MA = 0x0800,
- EXT_HW_CONFIG_DCS_18MA = 0x1000,
- EXT_HW_CONFIG_DCS_24MA = 0x1800,
- EXT_HW_CONFIG_DDS_MASK = 0x6000,
- EXT_HW_CONFIG_DDS_9MA = 0x0000,
- EXT_HW_CONFIG_DDS_15MA = 0x2000,
- EXT_HW_CONFIG_DDS_18MA = 0x4000,
- EXT_HW_CONFIG_DDS_24MA = 0x6000,
-};
-
-/* InternalChipConfig */
-enum {
- INTERNAL_CHIP_DM = 0x0001,
- INTERNAL_CHIP_SD = 0x0002,
- INTERNAL_CHIP_RAP_MASK = 0x000C,
- INTERNAL_CHIP_RAP_RR = 0x0000,
- INTERNAL_CHIP_RAP_NRM = 0x0004,
- INTERNAL_CHIP_RAP_ERM = 0x0008,
- INTERNAL_CHIP_RAP_ERMx = 0x000C,
- INTERNAL_CHIP_WE = 0x0010,
- INTERNAL_CHIP_EF = 0x0020,
- INTERNAL_CHIP_FR = 0x0040,
- INTERNAL_CHIP_FW = 0x0080,
- INTERNAL_CHIP_FI = 0x0100,
- INTERNAL_CHIP_FT = 0x0200,
-};
-
-/* portControl */
-enum {
- PORT_CONTROL_DS = 0x0001,
- PORT_CONTROL_HH = 0x0002,
- PORT_CONTROL_EI = 0x0004,
- PORT_CONTROL_ET = 0x0008,
- PORT_CONTROL_EF = 0x0010,
- PORT_CONTROL_DRM = 0x0020,
- PORT_CONTROL_RLB = 0x0040,
- PORT_CONTROL_RCB = 0x0080,
- PORT_CONTROL_MAC = 0x0100,
- PORT_CONTROL_IPV = 0x0200,
- PORT_CONTROL_IFP = 0x0400,
- PORT_CONTROL_ITP = 0x0800,
- PORT_CONTROL_FI = 0x1000,
- PORT_CONTROL_DFP = 0x2000,
- PORT_CONTROL_OI = 0x4000,
- PORT_CONTROL_CC = 0x8000,
-};
-
-/* portStatus */
-enum {
- PORT_STATUS_SM0 = 0x0001,
- PORT_STATUS_SM1 = 0x0002,
- PORT_STATUS_X = 0x0008,
- PORT_STATUS_DL = 0x0080,
- PORT_STATUS_IC = 0x0200,
- PORT_STATUS_MRC = 0x0400,
- PORT_STATUS_NL = 0x0800,
- PORT_STATUS_REV_ID_MASK = 0x7000,
- PORT_STATUS_REV_ID_1 = 0x1000,
- PORT_STATUS_REV_ID_2 = 0x2000,
- PORT_STATUS_REV_ID_3 = 0x3000,
- PORT_STATUS_64 = 0x8000,
- PORT_STATUS_UP0 = 0x10000,
- PORT_STATUS_AC0 = 0x20000,
- PORT_STATUS_AE0 = 0x40000,
- PORT_STATUS_UP1 = 0x100000,
- PORT_STATUS_AC1 = 0x200000,
- PORT_STATUS_AE1 = 0x400000,
- PORT_STATUS_F0_ENABLED = 0x1000000,
- PORT_STATUS_F1_ENABLED = 0x2000000,
- PORT_STATUS_F2_ENABLED = 0x4000000,
- PORT_STATUS_F3_ENABLED = 0x8000000,
-};
-
-/* macMIIMgmtControlReg */
-enum {
- MAC_ADDR_INDIRECT_PTR_REG_RP_MASK = 0x0003,
- MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_LWR = 0x0000,
- MAC_ADDR_INDIRECT_PTR_REG_RP_PRI_UPR = 0x0001,
- MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_LWR = 0x0002,
- MAC_ADDR_INDIRECT_PTR_REG_RP_SEC_UPR = 0x0003,
- MAC_ADDR_INDIRECT_PTR_REG_PR = 0x0008,
- MAC_ADDR_INDIRECT_PTR_REG_SS = 0x0010,
- MAC_ADDR_INDIRECT_PTR_REG_SE = 0x0020,
- MAC_ADDR_INDIRECT_PTR_REG_SP = 0x0040,
- MAC_ADDR_INDIRECT_PTR_REG_PE = 0x0080,
-};
-
-/* macMIIMgmtControlReg */
-enum {
- MAC_MII_CONTROL_RC = 0x0001,
- MAC_MII_CONTROL_SC = 0x0002,
- MAC_MII_CONTROL_AS = 0x0004,
- MAC_MII_CONTROL_NP = 0x0008,
- MAC_MII_CONTROL_CLK_SEL_MASK = 0x0070,
- MAC_MII_CONTROL_CLK_SEL_DIV2 = 0x0000,
- MAC_MII_CONTROL_CLK_SEL_DIV4 = 0x0010,
- MAC_MII_CONTROL_CLK_SEL_DIV6 = 0x0020,
- MAC_MII_CONTROL_CLK_SEL_DIV8 = 0x0030,
- MAC_MII_CONTROL_CLK_SEL_DIV10 = 0x0040,
- MAC_MII_CONTROL_CLK_SEL_DIV14 = 0x0050,
- MAC_MII_CONTROL_CLK_SEL_DIV20 = 0x0060,
- MAC_MII_CONTROL_CLK_SEL_DIV28 = 0x0070,
- MAC_MII_CONTROL_RM = 0x8000,
-};
-
-/* macMIIStatusReg */
-enum {
- MAC_MII_STATUS_BSY = 0x0001,
- MAC_MII_STATUS_SC = 0x0002,
- MAC_MII_STATUS_NV = 0x0004,
-};
-
-enum {
- MAC_CONFIG_REG_PE = 0x0001,
- MAC_CONFIG_REG_TF = 0x0002,
- MAC_CONFIG_REG_RF = 0x0004,
- MAC_CONFIG_REG_FD = 0x0008,
- MAC_CONFIG_REG_GM = 0x0010,
- MAC_CONFIG_REG_LB = 0x0020,
- MAC_CONFIG_REG_SR = 0x8000,
-};
-
-enum {
- MAC_HALF_DUPLEX_REG_ED = 0x10000,
- MAC_HALF_DUPLEX_REG_NB = 0x20000,
- MAC_HALF_DUPLEX_REG_BNB = 0x40000,
- MAC_HALF_DUPLEX_REG_ALT = 0x80000,
-};
-
-enum {
- IP_ADDR_INDEX_REG_MASK = 0x000f,
- IP_ADDR_INDEX_REG_FUNC_0_PRI = 0x0000,
- IP_ADDR_INDEX_REG_FUNC_0_SEC = 0x0001,
- IP_ADDR_INDEX_REG_FUNC_1_PRI = 0x0002,
- IP_ADDR_INDEX_REG_FUNC_1_SEC = 0x0003,
- IP_ADDR_INDEX_REG_FUNC_2_PRI = 0x0004,
- IP_ADDR_INDEX_REG_FUNC_2_SEC = 0x0005,
- IP_ADDR_INDEX_REG_FUNC_3_PRI = 0x0006,
- IP_ADDR_INDEX_REG_FUNC_3_SEC = 0x0007,
-};
-
-enum {
- PROBE_MUX_ADDR_REG_MUX_SEL_MASK = 0x003f,
- PROBE_MUX_ADDR_REG_SYSCLK = 0x0000,
- PROBE_MUX_ADDR_REG_PCICLK = 0x0040,
- PROBE_MUX_ADDR_REG_NRXCLK = 0x0080,
- PROBE_MUX_ADDR_REG_CPUCLK = 0x00C0,
- PROBE_MUX_ADDR_REG_MODULE_SEL_MASK = 0x3f00,
- PROBE_MUX_ADDR_REG_UP = 0x4000,
- PROBE_MUX_ADDR_REG_RE = 0x8000,
-};
-
-enum {
- STATISTICS_INDEX_REG_MASK = 0x01ff,
- STATISTICS_INDEX_REG_MAC0_TX_FRAME = 0x0000,
- STATISTICS_INDEX_REG_MAC0_TX_BYTES = 0x0001,
- STATISTICS_INDEX_REG_MAC0_TX_STAT1 = 0x0002,
- STATISTICS_INDEX_REG_MAC0_TX_STAT2 = 0x0003,
- STATISTICS_INDEX_REG_MAC0_TX_STAT3 = 0x0004,
- STATISTICS_INDEX_REG_MAC0_TX_STAT4 = 0x0005,
- STATISTICS_INDEX_REG_MAC0_TX_STAT5 = 0x0006,
- STATISTICS_INDEX_REG_MAC0_RX_FRAME = 0x0007,
- STATISTICS_INDEX_REG_MAC0_RX_BYTES = 0x0008,
- STATISTICS_INDEX_REG_MAC0_RX_STAT1 = 0x0009,
- STATISTICS_INDEX_REG_MAC0_RX_STAT2 = 0x000a,
- STATISTICS_INDEX_REG_MAC0_RX_STAT3 = 0x000b,
- STATISTICS_INDEX_REG_MAC0_RX_ERR_CRC = 0x000c,
- STATISTICS_INDEX_REG_MAC0_RX_ERR_ENC = 0x000d,
- STATISTICS_INDEX_REG_MAC0_RX_ERR_LEN = 0x000e,
- STATISTICS_INDEX_REG_MAC0_RX_STAT4 = 0x000f,
- STATISTICS_INDEX_REG_MAC1_TX_FRAME = 0x0010,
- STATISTICS_INDEX_REG_MAC1_TX_BYTES = 0x0011,
- STATISTICS_INDEX_REG_MAC1_TX_STAT1 = 0x0012,
- STATISTICS_INDEX_REG_MAC1_TX_STAT2 = 0x0013,
- STATISTICS_INDEX_REG_MAC1_TX_STAT3 = 0x0014,
- STATISTICS_INDEX_REG_MAC1_TX_STAT4 = 0x0015,
- STATISTICS_INDEX_REG_MAC1_TX_STAT5 = 0x0016,
- STATISTICS_INDEX_REG_MAC1_RX_FRAME = 0x0017,
- STATISTICS_INDEX_REG_MAC1_RX_BYTES = 0x0018,
- STATISTICS_INDEX_REG_MAC1_RX_STAT1 = 0x0019,
- STATISTICS_INDEX_REG_MAC1_RX_STAT2 = 0x001a,
- STATISTICS_INDEX_REG_MAC1_RX_STAT3 = 0x001b,
- STATISTICS_INDEX_REG_MAC1_RX_ERR_CRC = 0x001c,
- STATISTICS_INDEX_REG_MAC1_RX_ERR_ENC = 0x001d,
- STATISTICS_INDEX_REG_MAC1_RX_ERR_LEN = 0x001e,
- STATISTICS_INDEX_REG_MAC1_RX_STAT4 = 0x001f,
- STATISTICS_INDEX_REG_IP_TX_PKTS = 0x0020,
- STATISTICS_INDEX_REG_IP_TX_BYTES = 0x0021,
- STATISTICS_INDEX_REG_IP_TX_FRAG = 0x0022,
- STATISTICS_INDEX_REG_IP_RX_PKTS = 0x0023,
- STATISTICS_INDEX_REG_IP_RX_BYTES = 0x0024,
- STATISTICS_INDEX_REG_IP_RX_FRAG = 0x0025,
- STATISTICS_INDEX_REG_IP_DGRM_REASSEMBLY = 0x0026,
- STATISTICS_INDEX_REG_IP_V6_RX_PKTS = 0x0027,
- STATISTICS_INDEX_REG_IP_RX_PKTERR = 0x0028,
- STATISTICS_INDEX_REG_IP_REASSEMBLY_ERR = 0x0029,
- STATISTICS_INDEX_REG_TCP_TX_SEG = 0x0030,
- STATISTICS_INDEX_REG_TCP_TX_BYTES = 0x0031,
- STATISTICS_INDEX_REG_TCP_RX_SEG = 0x0032,
- STATISTICS_INDEX_REG_TCP_RX_BYTES = 0x0033,
- STATISTICS_INDEX_REG_TCP_TIMER_EXP = 0x0034,
- STATISTICS_INDEX_REG_TCP_RX_ACK = 0x0035,
- STATISTICS_INDEX_REG_TCP_TX_ACK = 0x0036,
- STATISTICS_INDEX_REG_TCP_RX_ERR = 0x0037,
- STATISTICS_INDEX_REG_TCP_RX_WIN_PROBE = 0x0038,
- STATISTICS_INDEX_REG_TCP_ECC_ERR_CORR = 0x003f,
-};
-
-enum {
- PORT_FATAL_ERROR_STATUS_OFB_RE_MAC0 = 0x00000001,
- PORT_FATAL_ERROR_STATUS_OFB_RE_MAC1 = 0x00000002,
- PORT_FATAL_ERROR_STATUS_OFB_WE = 0x00000004,
- PORT_FATAL_ERROR_STATUS_IFB_RE = 0x00000008,
- PORT_FATAL_ERROR_STATUS_IFB_WE_MAC0 = 0x00000010,
- PORT_FATAL_ERROR_STATUS_IFB_WE_MAC1 = 0x00000020,
- PORT_FATAL_ERROR_STATUS_ODE_RE = 0x00000040,
- PORT_FATAL_ERROR_STATUS_ODE_WE = 0x00000080,
- PORT_FATAL_ERROR_STATUS_IDE_RE = 0x00000100,
- PORT_FATAL_ERROR_STATUS_IDE_WE = 0x00000200,
- PORT_FATAL_ERROR_STATUS_SDE_RE = 0x00000400,
- PORT_FATAL_ERROR_STATUS_SDE_WE = 0x00000800,
- PORT_FATAL_ERROR_STATUS_BLE = 0x00001000,
- PORT_FATAL_ERROR_STATUS_SPE = 0x00002000,
- PORT_FATAL_ERROR_STATUS_EP0 = 0x00004000,
- PORT_FATAL_ERROR_STATUS_EP1 = 0x00008000,
- PORT_FATAL_ERROR_STATUS_ICE = 0x00010000,
- PORT_FATAL_ERROR_STATUS_ILE = 0x00020000,
- PORT_FATAL_ERROR_STATUS_OPE = 0x00040000,
- PORT_FATAL_ERROR_STATUS_TA = 0x00080000,
- PORT_FATAL_ERROR_STATUS_MA = 0x00100000,
- PORT_FATAL_ERROR_STATUS_SCE = 0x00200000,
- PORT_FATAL_ERROR_STATUS_RPE = 0x00400000,
- PORT_FATAL_ERROR_STATUS_MPE = 0x00800000,
- PORT_FATAL_ERROR_STATUS_OCE = 0x01000000,
-};
-
-/*
- * port control and status page - page 0
- */
-
-struct ql3xxx_port_registers {
- struct ql3xxx_common_registers CommonRegs;
-
- u32 ExternalHWConfig;
- u32 InternalChipConfig;
- u32 portControl;
- u32 portStatus;
- u32 macAddrIndirectPtrReg;
- u32 macAddrDataReg;
- u32 macMIIMgmtControlReg;
- u32 macMIIMgmtAddrReg;
- u32 macMIIMgmtDataReg;
- u32 macMIIStatusReg;
- u32 mac0ConfigReg;
- u32 mac0IpgIfgReg;
- u32 mac0HalfDuplexReg;
- u32 mac0MaxFrameLengthReg;
- u32 mac0PauseThresholdReg;
- u32 mac1ConfigReg;
- u32 mac1IpgIfgReg;
- u32 mac1HalfDuplexReg;
- u32 mac1MaxFrameLengthReg;
- u32 mac1PauseThresholdReg;
- u32 ipAddrIndexReg;
- u32 ipAddrDataReg;
- u32 ipReassemblyTimeout;
- u32 tcpMaxWindow;
- u32 currentTcpTimestamp[2];
- u32 internalRamRWAddrReg;
- u32 internalRamWDataReg;
- u32 reclaimedBufferAddrRegLow;
- u32 reclaimedBufferAddrRegHigh;
- u32 reserved[2];
- u32 fpgaRevID;
- u32 localRamAddr;
- u32 localRamDataAutoIncr;
- u32 localRamDataNonIncr;
- u32 gpOutput;
- u32 gpInput;
- u32 probeMuxAddr;
- u32 probeMuxData;
- u32 statisticsIndexReg;
- u32 statisticsReadDataRegAutoIncr;
- u32 statisticsReadDataRegNoIncr;
- u32 PortFatalErrStatus;
-};
-
-/*
- * port host memory config page - page 1
- */
-struct ql3xxx_host_memory_registers {
- struct ql3xxx_common_registers CommonRegs;
-
- u32 reserved[12];
-
- /* Network Request Queue */
- u32 reqConsumerIndex;
- u32 reqConsumerIndexAddrLow;
- u32 reqConsumerIndexAddrHigh;
- u32 reqBaseAddrLow;
- u32 reqBaseAddrHigh;
- u32 reqLength;
-
- /* Network Completion Queue */
- u32 rspProducerIndex;
- u32 rspProducerIndexAddrLow;
- u32 rspProducerIndexAddrHigh;
- u32 rspBaseAddrLow;
- u32 rspBaseAddrHigh;
- u32 rspLength;
-
- /* RX Large Buffer Queue */
- u32 rxLargeQConsumerIndex;
- u32 rxLargeQBaseAddrLow;
- u32 rxLargeQBaseAddrHigh;
- u32 rxLargeQLength;
- u32 rxLargeBufferLength;
-
- /* RX Small Buffer Queue */
- u32 rxSmallQConsumerIndex;
- u32 rxSmallQBaseAddrLow;
- u32 rxSmallQBaseAddrHigh;
- u32 rxSmallQLength;
- u32 rxSmallBufferLength;
-
-};
-
-/*
- * port local RAM page - page 2
- */
-struct ql3xxx_local_ram_registers {
- struct ql3xxx_common_registers CommonRegs;
- u32 bufletSize;
- u32 maxBufletCount;
- u32 currentBufletCount;
- u32 reserved;
- u32 freeBufletThresholdLow;
- u32 freeBufletThresholdHigh;
- u32 ipHashTableBase;
- u32 ipHashTableCount;
- u32 tcpHashTableBase;
- u32 tcpHashTableCount;
- u32 ncbBase;
- u32 maxNcbCount;
- u32 currentNcbCount;
- u32 drbBase;
- u32 maxDrbCount;
- u32 currentDrbCount;
-};
-
-/*
- * definitions for Semaphore bits in Semaphore/Serial NVRAM interface register
- */
-
-#define LS_64BITS(x) (u32)(0xffffffff & ((u64)x))
-#define MS_64BITS(x) (u32)(0xffffffff & (((u64)x)>>16>>16) )
-
-/*
- * I/O register
- */
-
-enum {
- CONTROL_REG = 0,
- STATUS_REG = 1,
- PHY_STAT_LINK_UP = 0x0004,
- PHY_CTRL_LOOPBACK = 0x4000,
-
- PETBI_CONTROL_REG = 0x00,
- PETBI_CTRL_SOFT_RESET = 0x8000,
- PETBI_CTRL_AUTO_NEG = 0x1000,
- PETBI_CTRL_RESTART_NEG = 0x0200,
- PETBI_CTRL_FULL_DUPLEX = 0x0100,
- PETBI_CTRL_SPEED_1000 = 0x0040,
-
- PETBI_STATUS_REG = 0x01,
- PETBI_STAT_NEG_DONE = 0x0020,
- PETBI_STAT_LINK_UP = 0x0004,
-
- PETBI_NEG_ADVER = 0x04,
- PETBI_NEG_PAUSE = 0x0080,
- PETBI_NEG_PAUSE_MASK = 0x0180,
- PETBI_NEG_DUPLEX = 0x0020,
- PETBI_NEG_DUPLEX_MASK = 0x0060,
-
- PETBI_NEG_PARTNER = 0x05,
- PETBI_NEG_ERROR_MASK = 0x3000,
-
- PETBI_EXPANSION_REG = 0x06,
- PETBI_EXP_PAGE_RX = 0x0002,
-
- PETBI_TBI_CTRL = 0x11,
- PETBI_TBI_RESET = 0x8000,
- PETBI_TBI_AUTO_SENSE = 0x0100,
- PETBI_TBI_SERDES_MODE = 0x0010,
- PETBI_TBI_SERDES_WRAP = 0x0002,
-
- AUX_CONTROL_STATUS = 0x1c,
- PHY_AUX_NEG_DONE = 0x8000,
- PHY_NEG_PARTNER = 5,
- PHY_AUX_DUPLEX_STAT = 0x0020,
- PHY_AUX_SPEED_STAT = 0x0018,
- PHY_AUX_NO_HW_STRAP = 0x0004,
- PHY_AUX_RESET_STICK = 0x0002,
- PHY_NEG_PAUSE = 0x0400,
- PHY_CTRL_SOFT_RESET = 0x8000,
- PHY_NEG_ADVER = 4,
- PHY_NEG_ADV_SPEED = 0x01e0,
- PHY_CTRL_RESTART_NEG = 0x0200,
-};
-enum {
-/* AM29LV Flash definitions */
- FM93C56A_START = 0x1,
-/* Commands */
- FM93C56A_READ = 0x2,
- FM93C56A_WEN = 0x0,
- FM93C56A_WRITE = 0x1,
- FM93C56A_WRITE_ALL = 0x0,
- FM93C56A_WDS = 0x0,
- FM93C56A_ERASE = 0x3,
- FM93C56A_ERASE_ALL = 0x0,
-/* Command Extentions */
- FM93C56A_WEN_EXT = 0x3,
- FM93C56A_WRITE_ALL_EXT = 0x1,
- FM93C56A_WDS_EXT = 0x0,
- FM93C56A_ERASE_ALL_EXT = 0x2,
-/* Special Bits */
- FM93C56A_READ_DUMMY_BITS = 1,
- FM93C56A_READY = 0,
- FM93C56A_BUSY = 1,
- FM93C56A_CMD_BITS = 2,
-/* AM29LV Flash definitions */
- FM93C56A_SIZE_8 = 0x100,
- FM93C56A_SIZE_16 = 0x80,
- FM93C66A_SIZE_8 = 0x200,
- FM93C66A_SIZE_16 = 0x100,
- FM93C86A_SIZE_16 = 0x400,
-/* Address Bits */
- FM93C56A_NO_ADDR_BITS_16 = 8,
- FM93C56A_NO_ADDR_BITS_8 = 9,
- FM93C86A_NO_ADDR_BITS_16 = 10,
-/* Data Bits */
- FM93C56A_DATA_BITS_16 = 16,
- FM93C56A_DATA_BITS_8 = 8,
-};
-enum {
-/* Auburn Bits */
- AUBURN_EEPROM_DI = 0x8,
- AUBURN_EEPROM_DI_0 = 0x0,
- AUBURN_EEPROM_DI_1 = 0x8,
- AUBURN_EEPROM_DO = 0x4,
- AUBURN_EEPROM_DO_0 = 0x0,
- AUBURN_EEPROM_DO_1 = 0x4,
- AUBURN_EEPROM_CS = 0x2,
- AUBURN_EEPROM_CS_0 = 0x0,
- AUBURN_EEPROM_CS_1 = 0x2,
- AUBURN_EEPROM_CLK_RISE = 0x1,
- AUBURN_EEPROM_CLK_FALL = 0x0,
-};
-enum {EEPROM_SIZE = FM93C86A_SIZE_16,
- EEPROM_NO_ADDR_BITS = FM93C86A_NO_ADDR_BITS_16,
- EEPROM_NO_DATA_BITS = FM93C56A_DATA_BITS_16,
-};
-
-/*
- * MAC Config data structure
- */
- struct eeprom_port_cfg {
- u16 etherMtu_mac;
- u16 pauseThreshold_mac;
- u16 resumeThreshold_mac;
- u16 portConfiguration;
-#define PORT_CONFIG_AUTO_NEG_ENABLED 0x8000
-#define PORT_CONFIG_SYM_PAUSE_ENABLED 0x4000
-#define PORT_CONFIG_FULL_DUPLEX_ENABLED 0x2000
-#define PORT_CONFIG_HALF_DUPLEX_ENABLED 0x1000
-#define PORT_CONFIG_1000MB_SPEED 0x0400
-#define PORT_CONFIG_100MB_SPEED 0x0200
-#define PORT_CONFIG_10MB_SPEED 0x0100
-#define PORT_CONFIG_LINK_SPEED_MASK 0x0F00
- u16 reserved[12];
-
-};
-
-/*
- * BIOS data structure
- */
-struct eeprom_bios_cfg {
- u16 SpinDlyEn:1, disBios:1, EnMemMap:1, EnSelectBoot:1, Reserved:12;
-
- u8 bootID0:7, boodID0Valid:1;
- u8 bootLun0[8];
-
- u8 bootID1:7, boodID1Valid:1;
- u8 bootLun1[8];
-
- u16 MaxLunsTrgt;
- u8 reserved[10];
-};
-
-/*
- * Function Specific Data structure
- */
-struct eeprom_function_cfg {
- u8 reserved[30];
- u8 macAddress[6];
- u8 macAddressSecondary[6];
-
- u16 subsysVendorId;
- u16 subsysDeviceId;
-};
-
-/*
- * EEPROM format
- */
-struct eeprom_data {
- u8 asicId[4];
- u8 version;
- u8 numPorts;
- u16 boardId;
-
-#define EEPROM_BOARDID_STR_SIZE 16
-#define EEPROM_SERIAL_NUM_SIZE 16
-
- u8 boardIdStr[16];
- u8 serialNumber[16];
- u16 extHwConfig;
- struct eeprom_port_cfg macCfg_port0;
- struct eeprom_port_cfg macCfg_port1;
- u16 bufletSize;
- u16 bufletCount;
- u16 tcpWindowThreshold50;
- u16 tcpWindowThreshold25;
- u16 tcpWindowThreshold0;
- u16 ipHashTableBaseHi;
- u16 ipHashTableBaseLo;
- u16 ipHashTableSize;
- u16 tcpHashTableBaseHi;
- u16 tcpHashTableBaseLo;
- u16 tcpHashTableSize;
- u16 ncbTableBaseHi;
- u16 ncbTableBaseLo;
- u16 ncbTableSize;
- u16 drbTableBaseHi;
- u16 drbTableBaseLo;
- u16 drbTableSize;
- u16 reserved_142[4];
- u16 ipReassemblyTimeout;
- u16 tcpMaxWindowSize;
- u16 ipSecurity;
-#define IPSEC_CONFIG_PRESENT 0x0001
- u8 reserved_156[294];
- u16 qDebug[8];
- struct eeprom_function_cfg funcCfg_fn0;
- u16 reserved_510;
- u8 oemSpace[432];
- struct eeprom_bios_cfg biosCfg_fn1;
- struct eeprom_function_cfg funcCfg_fn1;
- u16 reserved_1022;
- u8 reserved_1024[464];
- struct eeprom_function_cfg funcCfg_fn2;
- u16 reserved_1534;
- u8 reserved_1536[432];
- struct eeprom_bios_cfg biosCfg_fn3;
- struct eeprom_function_cfg funcCfg_fn3;
- u16 checksum;
-};
-
-/*
- * General definitions...
- */
-
-/*
- * Below are a number compiler switches for controlling driver behavior.
- * Some are not supported under certain conditions and are notated as such.
- */
-
-#define QL3XXX_VENDOR_ID 0x1077
-#define QL3022_DEVICE_ID 0x3022
-
-/* MTU & Frame Size stuff */
-#define NORMAL_MTU_SIZE ETH_DATA_LEN
-#define JUMBO_MTU_SIZE 9000
-#define VLAN_ID_LEN 2
-
-/* Request Queue Related Definitions */
-#define NUM_REQ_Q_ENTRIES 256 /* so that 64 * 64 = 4096 (1 page) */
-
-/* Response Queue Related Definitions */
-#define NUM_RSP_Q_ENTRIES 256 /* so that 256 * 16 = 4096 (1 page) */
-
-/* Transmit and Receive Buffers */
-#define NUM_LBUFQ_ENTRIES 128
-#define NUM_SBUFQ_ENTRIES 64
-#define QL_SMALL_BUFFER_SIZE 32
-#define QL_ADDR_ELE_PER_BUFQ_ENTRY \
-(sizeof(struct lrg_buf_q_entry) / sizeof(struct bufq_addr_element))
- /* Each send has at least control block. This is how many we keep. */
-#define NUM_SMALL_BUFFERS NUM_SBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY
-#define NUM_LARGE_BUFFERS NUM_LBUFQ_ENTRIES * QL_ADDR_ELE_PER_BUFQ_ENTRY
-#define QL_HEADER_SPACE 32 /* make header space at top of skb. */
-/*
- * Large & Small Buffers for Receives
- */
-struct lrg_buf_q_entry {
-
- u32 addr0_lower;
-#define IAL_LAST_ENTRY 0x00000001
-#define IAL_CONT_ENTRY 0x00000002
-#define IAL_FLAG_MASK 0x00000003
- u32 addr0_upper;
- u32 addr1_lower;
- u32 addr1_upper;
- u32 addr2_lower;
- u32 addr2_upper;
- u32 addr3_lower;
- u32 addr3_upper;
- u32 addr4_lower;
- u32 addr4_upper;
- u32 addr5_lower;
- u32 addr5_upper;
- u32 addr6_lower;
- u32 addr6_upper;
- u32 addr7_lower;
- u32 addr7_upper;
-
-};
-
-struct bufq_addr_element {
- u32 addr_low;
- u32 addr_high;
-};
-
-#define QL_NO_RESET 0
-#define QL_DO_RESET 1
-
-enum link_state_t {
- LS_UNKNOWN = 0,
- LS_DOWN,
- LS_DEGRADE,
- LS_RECOVER,
- LS_UP,
-};
-
-struct ql_rcv_buf_cb {
- struct ql_rcv_buf_cb *next;
- struct sk_buff *skb;
- DECLARE_PCI_UNMAP_ADDR(mapaddr);
- DECLARE_PCI_UNMAP_LEN(maplen);
- __le32 buf_phy_addr_low;
- __le32 buf_phy_addr_high;
- int index;
-};
-
-struct ql_tx_buf_cb {
- struct sk_buff *skb;
- struct ob_mac_iocb_req *queue_entry ;
- DECLARE_PCI_UNMAP_ADDR(mapaddr);
- DECLARE_PCI_UNMAP_LEN(maplen);
-};
-
-/* definitions for type field */
-#define QL_BUF_TYPE_MACIOCB 0x01
-#define QL_BUF_TYPE_IPIOCB 0x02
-#define QL_BUF_TYPE_TCPIOCB 0x03
-
-/* qdev->flags definitions. */
-enum { QL_RESET_DONE = 1, /* Reset finished. */
- QL_RESET_ACTIVE = 2, /* Waiting for reset to finish. */
- QL_RESET_START = 3, /* Please reset the chip. */
- QL_RESET_PER_SCSI = 4, /* SCSI driver requests reset. */
- QL_TX_TIMEOUT = 5, /* Timeout in progress. */
- QL_LINK_MASTER = 6, /* This driver controls the link. */
- QL_ADAPTER_UP = 7, /* Adapter has been brought up. */
- QL_THREAD_UP = 8, /* This flag is available. */
- QL_LINK_UP = 9, /* Link Status. */
- QL_ALLOC_REQ_RSP_Q_DONE = 10,
- QL_ALLOC_BUFQS_DONE = 11,
- QL_ALLOC_SMALL_BUF_DONE = 12,
- QL_LINK_OPTICAL = 13,
- QL_MSI_ENABLED = 14,
-};
-
-/*
- * ql3_adapter - The main Adapter structure definition.
- * This structure has all fields relevant to the hardware.
- */
-
-struct ql3_adapter {
- u32 reserved_00;
- unsigned long flags;
-
- /* PCI Configuration information for this device */
- struct pci_dev *pdev;
- struct net_device *ndev; /* Parent NET device */
-
- /* Hardware information */
- u8 chip_rev_id;
- u8 pci_slot;
- u8 pci_width;
- u8 pci_x;
- u32 msi;
- int index;
- struct timer_list adapter_timer; /* timer used for various functions */
-
- spinlock_t adapter_lock;
- spinlock_t hw_lock;
-
- /* PCI Bus Relative Register Addresses */
- u8 *mmap_virt_base; /* stores return value from ioremap() */
- struct ql3xxx_port_registers __iomem *mem_map_registers;
- u32 current_page; /* tracks current register page */
-
- u32 msg_enable;
- u8 reserved_01[2];
- u8 reserved_02[2];
-
- /* Page for Shadow Registers */
- void *shadow_reg_virt_addr;
- dma_addr_t shadow_reg_phy_addr;
-
- /* Net Request Queue */
- u32 req_q_size;
- u32 reserved_03;
- struct ob_mac_iocb_req *req_q_virt_addr;
- dma_addr_t req_q_phy_addr;
- u16 req_producer_index;
- u16 reserved_04;
- u16 *preq_consumer_index;
- u32 req_consumer_index_phy_addr_high;
- u32 req_consumer_index_phy_addr_low;
- atomic_t tx_count;
- struct ql_tx_buf_cb tx_buf[NUM_REQ_Q_ENTRIES];
-
- /* Net Response Queue */
- u32 rsp_q_size;
- u32 eeprom_cmd_data;
- struct net_rsp_iocb *rsp_q_virt_addr;
- dma_addr_t rsp_q_phy_addr;
- struct net_rsp_iocb *rsp_current;
- u16 rsp_consumer_index;
- u16 reserved_06;
- u32 *prsp_producer_index;
- u32 rsp_producer_index_phy_addr_high;
- u32 rsp_producer_index_phy_addr_low;
-
- /* Large Buffer Queue */
- u32 lrg_buf_q_alloc_size;
- u32 lrg_buf_q_size;
- void *lrg_buf_q_alloc_virt_addr;
- void *lrg_buf_q_virt_addr;
- dma_addr_t lrg_buf_q_alloc_phy_addr;
- dma_addr_t lrg_buf_q_phy_addr;
- u32 lrg_buf_q_producer_index;
- u32 lrg_buf_release_cnt;
- struct bufq_addr_element *lrg_buf_next_free;
-
- /* Large (Receive) Buffers */
- struct ql_rcv_buf_cb lrg_buf[NUM_LARGE_BUFFERS];
- struct ql_rcv_buf_cb *lrg_buf_free_head;
- struct ql_rcv_buf_cb *lrg_buf_free_tail;
- u32 lrg_buf_free_count;
- u32 lrg_buffer_len;
- u32 lrg_buf_index;
- u32 lrg_buf_skb_check;
-
- /* Small Buffer Queue */
- u32 small_buf_q_alloc_size;
- u32 small_buf_q_size;
- u32 small_buf_q_producer_index;
- void *small_buf_q_alloc_virt_addr;
- void *small_buf_q_virt_addr;
- dma_addr_t small_buf_q_alloc_phy_addr;
- dma_addr_t small_buf_q_phy_addr;
- u32 small_buf_index;
-
- /* Small (Receive) Buffers */
- void *small_buf_virt_addr;
- dma_addr_t small_buf_phy_addr;
- u32 small_buf_phy_addr_low;
- u32 small_buf_phy_addr_high;
- u32 small_buf_release_cnt;
- u32 small_buf_total_size;
-
- /* ISR related, saves status for DPC. */
- u32 control_status;
-
- struct eeprom_data nvram_data;
- struct timer_list ioctl_timer;
- u32 port_link_state;
- u32 last_rsp_offset;
-
- /* 4022 specific */
- u32 mac_index; /* Driver's MAC number can be 0 or 1 for first and second networking functions respectively */
- u32 PHYAddr; /* Address of PHY 0x1e00 Port 0 and 0x1f00 Port 1 */
- u32 mac_ob_opcode; /* Opcode to use on mac transmission */
- u32 tcp_ob_opcode; /* Opcode to use on tcp transmission */
- u32 update_ob_opcode; /* Opcode to use for updating NCB */
- u32 mb_bit_mask; /* MA Bits mask to use on transmission */
- u32 numPorts;
- struct net_device_stats stats;
- struct workqueue_struct *workqueue;
- struct work_struct reset_work;
- struct work_struct tx_timeout_work;
- u32 max_frame_size;
-};
-
-#endif /* _QLA3XXX_H_ */
diff --git a/trunk/drivers/net/skge.c b/trunk/drivers/net/skge.c
index 7de9a07b2ac2..82200bfaa8ed 100644
--- a/trunk/drivers/net/skge.c
+++ b/trunk/drivers/net/skge.c
@@ -516,7 +516,10 @@ static int skge_set_pauseparam(struct net_device *dev,
/* Chip internal frequency for clock calculations */
static inline u32 hwkhz(const struct skge_hw *hw)
{
- return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125;
+ if (hw->chip_id == CHIP_ID_GENESIS)
+ return 53215; /* or: 53.125 MHz */
+ else
+ return 78215; /* or: 78.125 MHz */
}
/* Chip HZ to microseconds */
diff --git a/trunk/drivers/net/sky2.c b/trunk/drivers/net/sky2.c
index 8f8799c3f9d1..de91609ca112 100644
--- a/trunk/drivers/net/sky2.c
+++ b/trunk/drivers/net/sky2.c
@@ -121,7 +121,6 @@ static const struct pci_device_id sky2_id_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) },
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) },
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) },
- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) },
{ 0 }
};
diff --git a/trunk/drivers/net/slhc.c b/trunk/drivers/net/slhc.c
index 9a540e2092b9..3a1b7131681c 100644
--- a/trunk/drivers/net/slhc.c
+++ b/trunk/drivers/net/slhc.c
@@ -94,23 +94,27 @@ slhc_init(int rslots, int tslots)
register struct cstate *ts;
struct slcompress *comp;
- comp = kzalloc(sizeof(struct slcompress), GFP_KERNEL);
+ comp = (struct slcompress *)kmalloc(sizeof(struct slcompress),
+ GFP_KERNEL);
if (! comp)
goto out_fail;
+ memset(comp, 0, sizeof(struct slcompress));
if ( rslots > 0 && rslots < 256 ) {
size_t rsize = rslots * sizeof(struct cstate);
- comp->rstate = kzalloc(rsize, GFP_KERNEL);
+ comp->rstate = (struct cstate *) kmalloc(rsize, GFP_KERNEL);
if (! comp->rstate)
goto out_free;
+ memset(comp->rstate, 0, rsize);
comp->rslot_limit = rslots - 1;
}
if ( tslots > 0 && tslots < 256 ) {
size_t tsize = tslots * sizeof(struct cstate);
- comp->tstate = kzalloc(tsize, GFP_KERNEL);
+ comp->tstate = (struct cstate *) kmalloc(tsize, GFP_KERNEL);
if (! comp->tstate)
goto out_free2;
+ memset(comp->tstate, 0, tsize);
comp->tslot_limit = tslots - 1;
}
@@ -137,9 +141,9 @@ slhc_init(int rslots, int tslots)
return comp;
out_free2:
- kfree(comp->rstate);
+ kfree((unsigned char *)comp->rstate);
out_free:
- kfree(comp);
+ kfree((unsigned char *)comp);
out_fail:
return NULL;
}
@@ -696,6 +700,20 @@ EXPORT_SYMBOL(slhc_compress);
EXPORT_SYMBOL(slhc_uncompress);
EXPORT_SYMBOL(slhc_toss);
+#ifdef MODULE
+
+int init_module(void)
+{
+ printk(KERN_INFO "CSLIP: code copyright 1989 Regents of the University of California\n");
+ return 0;
+}
+
+void cleanup_module(void)
+{
+ return;
+}
+
+#endif /* MODULE */
#else /* CONFIG_INET */
diff --git a/trunk/drivers/net/sunlance.c b/trunk/drivers/net/sunlance.c
index 0e3fdf7c6dd3..1ef9fd39a79a 100644
--- a/trunk/drivers/net/sunlance.c
+++ b/trunk/drivers/net/sunlance.c
@@ -1537,7 +1537,7 @@ static int __init sparc_lance_init(void)
{
if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) ||
(idprom->id_machtype == (SM_SUN4|SM_4_470))) {
- memset(&sun4_sdev, 0, sizeof(struct sbus_dev));
+ memset(&sun4_sdev, 0, sizeof(sdev));
sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr;
sun4_sdev.irqs[0] = 6;
return sparc_lance_probe_one(&sun4_sdev, NULL, NULL);
@@ -1547,16 +1547,16 @@ static int __init sparc_lance_init(void)
static int __exit sunlance_sun4_remove(void)
{
- struct lance_private *lp = dev_get_drvdata(&sun4_sdev.ofdev.dev);
+ struct lance_private *lp = dev_get_drvdata(&sun4_sdev->dev);
struct net_device *net_dev = lp->dev;
unregister_netdevice(net_dev);
- lance_free_hwresources(lp);
+ lance_free_hwresources(root_lance_dev);
free_netdev(net_dev);
- dev_set_drvdata(&sun4_sdev.ofdev.dev, NULL);
+ dev_set_drvdata(&sun4_sdev->dev, NULL);
return 0;
}
diff --git a/trunk/drivers/net/tg3.c b/trunk/drivers/net/tg3.c
index 6f97962dd06b..1b8138f641e3 100644
--- a/trunk/drivers/net/tg3.c
+++ b/trunk/drivers/net/tg3.c
@@ -68,8 +68,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
-#define DRV_MODULE_VERSION "3.64"
-#define DRV_MODULE_RELDATE "July 31, 2006"
+#define DRV_MODULE_VERSION "3.63"
+#define DRV_MODULE_RELDATE "July 25, 2006"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
@@ -3097,7 +3097,7 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key,
* Callers depend upon this behavior and assume that
* we leave everything unchanged if we fail.
*/
- skb = netdev_alloc_skb(tp->dev, skb_size);
+ skb = dev_alloc_skb(skb_size);
if (skb == NULL)
return -ENOMEM;
@@ -3270,7 +3270,7 @@ static int tg3_rx(struct tg3 *tp, int budget)
tg3_recycle_rx(tp, opaque_key,
desc_idx, *post_ptr);
- copy_skb = netdev_alloc_skb(tp->dev, len + 2);
+ copy_skb = dev_alloc_skb(len + 2);
if (copy_skb == NULL)
goto drop_it_no_recycle;
@@ -8618,7 +8618,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode)
err = -EIO;
tx_len = 1514;
- skb = netdev_alloc_skb(tp->dev, tx_len);
+ skb = dev_alloc_skb(tx_len);
if (!skb)
return -ENOMEM;
diff --git a/trunk/drivers/net/tulip/uli526x.c b/trunk/drivers/net/tulip/uli526x.c
index c4c720e2d4c3..fd64b2b3e99c 100644
--- a/trunk/drivers/net/tulip/uli526x.c
+++ b/trunk/drivers/net/tulip/uli526x.c
@@ -1702,6 +1702,7 @@ MODULE_PARM_DESC(mode, "ULi M5261/M5263: Bit 0: 10/100Mbps, bit 2: duplex, bit 8
static int __init uli526x_init_module(void)
{
+ int rc;
printk(version);
printed_version = 1;
@@ -1713,19 +1714,22 @@ static int __init uli526x_init_module(void)
if (cr6set)
uli526x_cr6_user_set = cr6set;
- switch (mode) {
+ switch(mode) {
case ULI526X_10MHF:
case ULI526X_100MHF:
case ULI526X_10MFD:
case ULI526X_100MFD:
uli526x_media_mode = mode;
break;
- default:
- uli526x_media_mode = ULI526X_AUTO;
+ default:uli526x_media_mode = ULI526X_AUTO;
break;
}
- return pci_register_driver(&uli526x_driver);
+ rc = pci_module_init(&uli526x_driver);
+ if (rc < 0)
+ return rc;
+
+ return 0;
}
diff --git a/trunk/drivers/net/via-velocity.c b/trunk/drivers/net/via-velocity.c
index aa9cd92f46b2..f5b0078eb4ad 100644
--- a/trunk/drivers/net/via-velocity.c
+++ b/trunk/drivers/net/via-velocity.c
@@ -2742,7 +2742,7 @@ static u32 check_connection_type(struct mac_regs __iomem * regs)
if (PHYSR0 & PHYSR0_SPDG)
status |= VELOCITY_SPEED_1000;
- else if (PHYSR0 & PHYSR0_SPD10)
+ if (PHYSR0 & PHYSR0_SPD10)
status |= VELOCITY_SPEED_10;
else
status |= VELOCITY_SPEED_100;
@@ -2851,17 +2851,8 @@ static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd
u32 status;
status = check_connection_type(vptr->mac_regs);
- cmd->supported = SUPPORTED_TP |
- SUPPORTED_Autoneg |
- SUPPORTED_10baseT_Half |
- SUPPORTED_10baseT_Full |
- SUPPORTED_100baseT_Half |
- SUPPORTED_100baseT_Full |
- SUPPORTED_1000baseT_Half |
- SUPPORTED_1000baseT_Full;
- if (status & VELOCITY_SPEED_1000)
- cmd->speed = SPEED_1000;
- else if (status & VELOCITY_SPEED_100)
+ cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full;
+ if (status & VELOCITY_SPEED_100)
cmd->speed = SPEED_100;
else
cmd->speed = SPEED_10;
@@ -2905,7 +2896,7 @@ static u32 velocity_get_link(struct net_device *dev)
{
struct velocity_info *vptr = netdev_priv(dev);
struct mac_regs __iomem * regs = vptr->mac_regs;
- return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 1 : 0;
+ return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, ®s->PHYSR0) ? 0 : 1;
}
static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
diff --git a/trunk/drivers/net/wireless/bcm43xx/bcm43xx.h b/trunk/drivers/net/wireless/bcm43xx/bcm43xx.h
index ee6571ed706d..bee84b58060c 100644
--- a/trunk/drivers/net/wireless/bcm43xx/bcm43xx.h
+++ b/trunk/drivers/net/wireless/bcm43xx/bcm43xx.h
@@ -737,6 +737,8 @@ struct bcm43xx_private {
u32 irq_savedstate;
/* Link Quality calculation context. */
struct bcm43xx_noise_calculation noisecalc;
+ /* if > 0 MAC is suspended. if == 0 MAC is enabled. */
+ int mac_suspended;
/* Threshold values. */
//TODO: The RTS thr has to be _used_. Currently, it is only set via WX.
diff --git a/trunk/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/trunk/drivers/net/wireless/bcm43xx/bcm43xx_main.c
index ab3a0ee9fac8..1af330d496fc 100644
--- a/trunk/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ b/trunk/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -2298,13 +2298,17 @@ static int bcm43xx_gpio_cleanup(struct bcm43xx_private *bcm)
/* http://bcm-specs.sipsolutions.net/EnableMac */
void bcm43xx_mac_enable(struct bcm43xx_private *bcm)
{
- bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
- bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
- | BCM43xx_SBF_MAC_ENABLED);
- bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, BCM43xx_IRQ_READY);
- bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */
- bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
- bcm43xx_power_saving_ctl_bits(bcm, -1, -1);
+ bcm->mac_suspended--;
+ assert(bcm->mac_suspended >= 0);
+ if (bcm->mac_suspended == 0) {
+ bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
+ bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
+ | BCM43xx_SBF_MAC_ENABLED);
+ bcm43xx_write32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON, BCM43xx_IRQ_READY);
+ bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD); /* dummy read */
+ bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
+ bcm43xx_power_saving_ctl_bits(bcm, -1, -1);
+ }
}
/* http://bcm-specs.sipsolutions.net/SuspendMAC */
@@ -2313,18 +2317,23 @@ void bcm43xx_mac_suspend(struct bcm43xx_private *bcm)
int i;
u32 tmp;
- bcm43xx_power_saving_ctl_bits(bcm, -1, 1);
- bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
- bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
- & ~BCM43xx_SBF_MAC_ENABLED);
- bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
- for (i = 100000; i; i--) {
- tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
- if (tmp & BCM43xx_IRQ_READY)
- return;
- udelay(10);
+ assert(bcm->mac_suspended >= 0);
+ if (bcm->mac_suspended == 0) {
+ bcm43xx_power_saving_ctl_bits(bcm, -1, 1);
+ bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD,
+ bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD)
+ & ~BCM43xx_SBF_MAC_ENABLED);
+ bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); /* dummy read */
+ for (i = 100000; i; i--) {
+ tmp = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
+ if (tmp & BCM43xx_IRQ_READY)
+ goto out;
+ udelay(10);
+ }
+ printkl(KERN_ERR PFX "MAC suspend failed\n");
}
- printkl(KERN_ERR PFX "MAC suspend failed\n");
+out:
+ bcm->mac_suspended++;
}
void bcm43xx_set_iwmode(struct bcm43xx_private *bcm,
@@ -3183,7 +3192,9 @@ static void bcm43xx_periodic_work_handler(void *d)
* be preemtible.
*/
netif_stop_queue(bcm->net_dev);
+ synchronize_net();
spin_lock_irqsave(&bcm->irq_lock, flags);
+ bcm43xx_mac_suspend(bcm);
if (bcm43xx_using_pio(bcm))
bcm43xx_pio_freeze_txqueues(bcm);
savedirqs = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL);
@@ -3207,6 +3218,7 @@ static void bcm43xx_periodic_work_handler(void *d)
bcm43xx_interrupt_enable(bcm, savedirqs);
if (bcm43xx_using_pio(bcm))
bcm43xx_pio_thaw_txqueues(bcm);
+ bcm43xx_mac_enable(bcm);
}
netif_wake_queue(bcm->net_dev);
}
@@ -3820,6 +3832,7 @@ static int bcm43xx_init_private(struct bcm43xx_private *bcm,
bcm->softmac->set_channel = bcm43xx_ieee80211_set_chan;
bcm->irq_savedstate = BCM43xx_IRQ_INITIAL;
+ bcm->mac_suspended = 1;
bcm->pci_dev = pci_dev;
bcm->net_dev = net_dev;
bcm->bad_frames_preempt = modparam_bad_frames_preempt;
diff --git a/trunk/drivers/net/wireless/zd1211rw/zd_chip.c b/trunk/drivers/net/wireless/zd1211rw/zd_chip.c
index da9d06bdb818..efc9c4bd826f 100644
--- a/trunk/drivers/net/wireless/zd1211rw/zd_chip.c
+++ b/trunk/drivers/net/wireless/zd1211rw/zd_chip.c
@@ -797,7 +797,7 @@ static int zd1211_hw_init_hmac(struct zd_chip *chip)
{ CR_ADDA_MBIAS_WARMTIME, 0x30000808 },
{ CR_ZD1211_RETRY_MAX, 0x2 },
{ CR_SNIFFER_ON, 0 },
- { CR_RX_FILTER, STA_RX_FILTER },
+ { CR_RX_FILTER, AP_RX_FILTER },
{ CR_GROUP_HASH_P1, 0x00 },
{ CR_GROUP_HASH_P2, 0x80000000 },
{ CR_REG1, 0xa4 },
@@ -844,7 +844,7 @@ static int zd1211b_hw_init_hmac(struct zd_chip *chip)
{ CR_ZD1211B_AIFS_CTL2, 0x008C003C },
{ CR_ZD1211B_TXOP, 0x01800824 },
{ CR_SNIFFER_ON, 0 },
- { CR_RX_FILTER, STA_RX_FILTER },
+ { CR_RX_FILTER, AP_RX_FILTER },
{ CR_GROUP_HASH_P1, 0x00 },
{ CR_GROUP_HASH_P2, 0x80000000 },
{ CR_REG1, 0xa4 },
diff --git a/trunk/drivers/net/wireless/zd1211rw/zd_chip.h b/trunk/drivers/net/wireless/zd1211rw/zd_chip.h
index 069d2b467339..805121093ab5 100644
--- a/trunk/drivers/net/wireless/zd1211rw/zd_chip.h
+++ b/trunk/drivers/net/wireless/zd1211rw/zd_chip.h
@@ -461,15 +461,10 @@
#define CR_RX_FILTER CTL_REG(0x068c)
#define RX_FILTER_ASSOC_RESPONSE 0x0002
-#define RX_FILTER_REASSOC_RESPONSE 0x0008
#define RX_FILTER_PROBE_RESPONSE 0x0020
#define RX_FILTER_BEACON 0x0100
-#define RX_FILTER_DISASSOC 0x0400
#define RX_FILTER_AUTH 0x0800
-#define AP_RX_FILTER 0x0400feff
-#define STA_RX_FILTER 0x0000ffff
-
-/* Monitor mode sets filter to 0xfffff */
+/* Sniff modus sets filter to 0xfffff */
#define CR_ACK_TIMEOUT_EXT CTL_REG(0x0690)
#define CR_BCN_FIFO_SEMAPHORE CTL_REG(0x0694)
@@ -551,6 +546,9 @@
#define CR_ZD1211B_TXOP CTL_REG(0x0b20)
#define CR_ZD1211B_RETRY_MAX CTL_REG(0x0b28)
+#define AP_RX_FILTER 0x0400feff
+#define STA_RX_FILTER 0x0000ffff
+
#define CWIN_SIZE 0x007f043f
diff --git a/trunk/drivers/net/wireless/zd1211rw/zd_mac.c b/trunk/drivers/net/wireless/zd1211rw/zd_mac.c
index d6f3e02a0b54..3bdc54d128d0 100644
--- a/trunk/drivers/net/wireless/zd1211rw/zd_mac.c
+++ b/trunk/drivers/net/wireless/zd1211rw/zd_mac.c
@@ -108,9 +108,7 @@ int zd_mac_init_hw(struct zd_mac *mac, u8 device_type)
if (r)
goto disable_int;
- /* We must inform the device that we are doing encryption/decryption in
- * software at the moment. */
- r = zd_set_encryption_type(chip, ENC_SNIFFER);
+ r = zd_set_encryption_type(chip, NO_WEP);
if (r)
goto disable_int;
@@ -138,8 +136,10 @@ static int reset_mode(struct zd_mac *mac)
{
struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
struct zd_ioreq32 ioreqs[3] = {
- { CR_RX_FILTER, STA_RX_FILTER },
+ { CR_RX_FILTER, RX_FILTER_BEACON|RX_FILTER_PROBE_RESPONSE|
+ RX_FILTER_AUTH|RX_FILTER_ASSOC_RESPONSE },
{ CR_SNIFFER_ON, 0U },
+ { CR_ENCRYPTION_TYPE, NO_WEP },
};
if (ieee->iw_mode == IW_MODE_MONITOR) {
@@ -713,10 +713,10 @@ static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri)
struct zd_rt_hdr {
struct ieee80211_radiotap_header rt_hdr;
u8 rt_flags;
- u8 rt_rate;
u16 rt_channel;
u16 rt_chbitmask;
-} __attribute__((packed));
+ u16 rt_rate;
+};
static void fill_rt_header(void *buffer, struct zd_mac *mac,
const struct ieee80211_rx_stats *stats,
@@ -735,14 +735,14 @@ static void fill_rt_header(void *buffer, struct zd_mac *mac,
if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256))
hdr->rt_flags |= IEEE80211_RADIOTAP_F_WEP;
- hdr->rt_rate = stats->rate / 5;
-
/* FIXME: 802.11a */
hdr->rt_channel = cpu_to_le16(ieee80211chan2mhz(
_zd_chip_get_channel(&mac->chip)));
hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ |
((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) ==
ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK));
+
+ hdr->rt_rate = stats->rate / 5;
}
/* Returns 1 if the data packet is for us and 0 otherwise. */
diff --git a/trunk/drivers/net/wireless/zd1211rw/zd_usb.c b/trunk/drivers/net/wireless/zd1211rw/zd_usb.c
index 96551da769fc..c68b9f8995c9 100644
--- a/trunk/drivers/net/wireless/zd1211rw/zd_usb.c
+++ b/trunk/drivers/net/wireless/zd1211rw/zd_usb.c
@@ -325,6 +325,7 @@ static void disable_read_regs_int(struct zd_usb *usb)
{
struct zd_usb_interrupt *intr = &usb->intr;
+ ZD_ASSERT(in_interrupt());
spin_lock(&intr->lock);
intr->read_regs_enabled = 0;
spin_unlock(&intr->lock);
@@ -546,11 +547,11 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer,
* be padded. Unaligned access might also happen if the length_info
* structure is not present.
*/
- if (get_unaligned(&length_info->tag) == cpu_to_le16(RX_LENGTH_INFO_TAG))
- {
+ if (get_unaligned(&length_info->tag) == RX_LENGTH_INFO_TAG) {
unsigned int l, k, n;
for (i = 0, l = 0;; i++) {
- k = le16_to_cpu(get_unaligned(&length_info->length[i]));
+ k = le16_to_cpu(get_unaligned(
+ &length_info->length[i]));
n = l+k;
if (n > length)
return;
diff --git a/trunk/drivers/pci/search.c b/trunk/drivers/pci/search.c
index f8ae2b7db0a7..622b3f8ba820 100644
--- a/trunk/drivers/pci/search.c
+++ b/trunk/drivers/pci/search.c
@@ -61,7 +61,7 @@ struct pci_bus * __devinit pci_find_bus(int domain, int busnr)
* @from: Previous PCI bus found, or %NULL for new search.
*
* Iterates through the list of known PCI busses. A new search is
- * initiated by passing %NULL as the @from argument. Otherwise if
+ * initiated by passing %NULL to the @from argument. Otherwise if
* @from is not %NULL, searches continue from next device on the
* global list.
*/
@@ -148,14 +148,13 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn)
* @from: Previous PCI device found in search, or %NULL for new search.
*
* Iterates through the list of known PCI devices. If a PCI device is
- * found with a matching @vendor, @device, @ss_vendor and @ss_device, a
- * pointer to its device structure is returned. Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL as the @from argument.
- * Otherwise if @from is not %NULL, searches continue from next device
- * on the global list.
+ * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
+ * device structure is returned. Otherwise, %NULL is returned.
+ * A new search is initiated by passing %NULL to the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from next device on the global list.
*
- * NOTE: Do not use this function any more; use pci_get_subsys() instead, as
- * the PCI device returned by this function can disappear at any moment in
+ * NOTE: Do not use this function anymore, use pci_get_subsys() instead, as
+ * the pci device returned by this function can disappear at any moment in
* time.
*/
static struct pci_dev * pci_find_subsys(unsigned int vendor,
@@ -192,15 +191,14 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor,
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
* @from: Previous PCI device found in search, or %NULL for new search.
*
- * Iterates through the list of known PCI devices. If a PCI device is found
- * with a matching @vendor and @device, a pointer to its device structure is
+ * Iterates through the list of known PCI devices. If a PCI device is
+ * found with a matching @vendor and @device, a pointer to its device structure is
* returned. Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL as the @from argument.
- * Otherwise if @from is not %NULL, searches continue from next device
- * on the global list.
+ * A new search is initiated by passing %NULL to the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from next device on the global list.
*
- * NOTE: Do not use this function any more; use pci_get_device() instead, as
- * the PCI device returned by this function can disappear at any moment in
+ * NOTE: Do not use this function anymore, use pci_get_device() instead, as
+ * the pci device returned by this function can disappear at any moment in
* time.
*/
struct pci_dev *
@@ -217,11 +215,11 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *
* @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids
* @from: Previous PCI device found in search, or %NULL for new search.
*
- * Iterates through the list of known PCI devices. If a PCI device is found
- * with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
+ * Iterates through the list of known PCI devices. If a PCI device is
+ * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
* device structure is returned, and the reference count to the device is
* incremented. Otherwise, %NULL is returned. A new search is initiated by
- * passing %NULL as the @from argument. Otherwise if @from is not %NULL,
+ * passing %NULL to the @from argument. Otherwise if @from is not %NULL,
* searches continue from next device on the global list.
* The reference count for @from is always decremented if it is not %NULL.
*/
@@ -264,7 +262,7 @@ pci_get_subsys(unsigned int vendor, unsigned int device,
* found with a matching @vendor and @device, the reference count to the
* device is incremented and a pointer to its device structure is returned.
* Otherwise, %NULL is returned. A new search is initiated by passing %NULL
- * as the @from argument. Otherwise if @from is not %NULL, searches continue
+ * to the @from argument. Otherwise if @from is not %NULL, searches continue
* from next device on the global list. The reference count for @from is
* always decremented if it is not %NULL.
*/
@@ -281,13 +279,11 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
* @from: Previous PCI device found in search, or %NULL for new search.
*
- * Iterates through the list of known PCI devices in the reverse order of
- * pci_find_device().
+ * Iterates through the list of known PCI devices in the reverse order of pci_find_device().
* If a PCI device is found with a matching @vendor and @device, a pointer to
* its device structure is returned. Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL as the @from argument.
- * Otherwise if @from is not %NULL, searches continue from previous device
- * on the global list.
+ * A new search is initiated by passing %NULL to the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from previous device on the global list.
*/
struct pci_dev *
pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from)
@@ -321,7 +317,7 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p
* found with a matching @class, the reference count to the device is
* incremented and a pointer to its device structure is returned.
* Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL as the @from argument.
+ * A new search is initiated by passing %NULL to the @from argument.
* Otherwise if @from is not %NULL, searches continue from next device
* on the global list. The reference count for @from is always decremented
* if it is not %NULL.
diff --git a/trunk/drivers/pcmcia/pcmcia_ioctl.c b/trunk/drivers/pcmcia/pcmcia_ioctl.c
index 9ad18e62658d..738b1ef595a3 100644
--- a/trunk/drivers/pcmcia/pcmcia_ioctl.c
+++ b/trunk/drivers/pcmcia/pcmcia_ioctl.c
@@ -601,8 +601,12 @@ static int ds_ioctl(struct inode * inode, struct file * file,
ret = CS_BAD_ARGS;
else {
struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function);
- ret = pccard_get_configuration_info(s, p_dev, &buf->config);
- pcmcia_put_dev(p_dev);
+ if (p_dev == NULL)
+ ret = CS_BAD_ARGS;
+ else {
+ ret = pccard_get_configuration_info(s, p_dev, &buf->config);
+ pcmcia_put_dev(p_dev);
+ }
}
break;
case DS_GET_FIRST_TUPLE:
@@ -632,8 +636,12 @@ static int ds_ioctl(struct inode * inode, struct file * file,
ret = CS_BAD_ARGS;
else {
struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function);
- ret = pccard_get_status(s, p_dev, &buf->status);
- pcmcia_put_dev(p_dev);
+ if (p_dev == NULL)
+ ret = CS_BAD_ARGS;
+ else {
+ ret = pccard_get_status(s, p_dev, &buf->status);
+ pcmcia_put_dev(p_dev);
+ }
}
break;
case DS_VALIDATE_CIS:
diff --git a/trunk/drivers/pcmcia/pcmcia_resource.c b/trunk/drivers/pcmcia/pcmcia_resource.c
index c8323399e9e4..7bf25b88ea31 100644
--- a/trunk/drivers/pcmcia/pcmcia_resource.c
+++ b/trunk/drivers/pcmcia/pcmcia_resource.c
@@ -245,17 +245,10 @@ int pccard_get_configuration_info(struct pcmcia_socket *s,
return CS_SUCCESS;
}
- config->Attributes = c->Attributes | CONF_VALID_CLIENT;
- config->Vcc = s->socket.Vcc;
- config->Vpp1 = config->Vpp2 = s->socket.Vpp;
- config->IntType = c->IntType;
- config->ConfigBase = c->ConfigBase;
- config->Status = c->Status;
- config->Pin = c->Pin;
- config->Copy = c->Copy;
- config->Option = c->Option;
- config->ExtStatus = c->ExtStatus;
- config->Present = config->CardValues = c->CardValues;
+ /* !!! This is a hack !!! */
+ memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
+ config->Attributes |= CONF_VALID_CLIENT;
+ config->CardValues = c->CardValues;
config->IRQAttributes = c->irq.Attributes;
config->AssignedIRQ = s->irq.AssignedIRQ;
config->BasePort1 = c->io.BasePort1;
diff --git a/trunk/drivers/pnp/pnpbios/core.c b/trunk/drivers/pnp/pnpbios/core.c
index 551f58e29810..b154b3f52cbe 100644
--- a/trunk/drivers/pnp/pnpbios/core.c
+++ b/trunk/drivers/pnp/pnpbios/core.c
@@ -346,7 +346,7 @@ static int insert_device(struct pnp_dev *dev, struct pnp_bios_node * node)
dev->flags = node->flags;
if (!(dev->flags & PNPBIOS_NO_CONFIG))
dev->capabilities |= PNP_CONFIGURABLE;
- if (!(dev->flags & PNPBIOS_NO_DISABLE) && pnpbios_is_dynamic(dev))
+ if (!(dev->flags & PNPBIOS_NO_DISABLE))
dev->capabilities |= PNP_DISABLE;
dev->capabilities |= PNP_READ;
if (pnpbios_is_dynamic(dev))
diff --git a/trunk/drivers/s390/cio/ccwgroup.c b/trunk/drivers/s390/cio/ccwgroup.c
index 3cba6c9fab11..f26a2ee3aad8 100644
--- a/trunk/drivers/s390/cio/ccwgroup.c
+++ b/trunk/drivers/s390/cio/ccwgroup.c
@@ -152,6 +152,7 @@ ccwgroup_create(struct device *root,
struct ccwgroup_device *gdev;
int i;
int rc;
+ int del_drvdata;
if (argc > 256) /* disallow dumb users */
return -EINVAL;
@@ -162,6 +163,7 @@ ccwgroup_create(struct device *root,
atomic_set(&gdev->onoff, 0);
+ del_drvdata = 0;
for (i = 0; i < argc; i++) {
gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]);
@@ -178,8 +180,10 @@ ccwgroup_create(struct device *root,
rc = -EINVAL;
goto free_dev;
}
- gdev->cdev[i]->dev.driver_data = gdev;
}
+ for (i = 0; i < argc; i++)
+ gdev->cdev[i]->dev.driver_data = gdev;
+ del_drvdata = 1;
gdev->creator_id = creator_id;
gdev->count = argc;
@@ -222,9 +226,9 @@ ccwgroup_create(struct device *root,
free_dev:
for (i = 0; i < argc; i++)
if (gdev->cdev[i]) {
- if (gdev->cdev[i]->dev.driver_data == gdev)
- gdev->cdev[i]->dev.driver_data = NULL;
put_device(&gdev->cdev[i]->dev);
+ if (del_drvdata)
+ gdev->cdev[i]->dev.driver_data = NULL;
}
kfree(gdev);
return rc;
diff --git a/trunk/drivers/s390/cio/device_fsm.c b/trunk/drivers/s390/cio/device_fsm.c
index 7a39e0b0386c..ac6e0c7e43d9 100644
--- a/trunk/drivers/s390/cio/device_fsm.c
+++ b/trunk/drivers/s390/cio/device_fsm.c
@@ -152,8 +152,7 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev)
if (cdev->private->iretry) {
cdev->private->iretry--;
ret = cio_halt(sch);
- if (ret != -EBUSY)
- return (ret == 0) ? -EBUSY : ret;
+ return (ret == 0) ? -EBUSY : ret;
}
/* halt io unsuccessful. */
cdev->private->iretry = 255; /* 255 clear retries. */
diff --git a/trunk/drivers/scsi/aic7xxx/aicasm/Makefile b/trunk/drivers/scsi/aic7xxx/aicasm/Makefile
index b98c5c1056c3..8c91fda6482c 100644
--- a/trunk/drivers/scsi/aic7xxx/aicasm/Makefile
+++ b/trunk/drivers/scsi/aic7xxx/aicasm/Makefile
@@ -14,8 +14,6 @@ LIBS= -ldb
clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG)
# Override default kernel CFLAGS. This is a userland app.
AICASM_CFLAGS:= -I/usr/include -I.
-LEX= flex
-YACC= bison
YFLAGS= -d
NOMAN= noman
diff --git a/trunk/drivers/scsi/libata-eh.c b/trunk/drivers/scsi/libata-eh.c
index 29f59345305d..4b6aa30f4d68 100644
--- a/trunk/drivers/scsi/libata-eh.c
+++ b/trunk/drivers/scsi/libata-eh.c
@@ -764,27 +764,12 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev,
unsigned int action)
{
unsigned long flags;
- struct ata_eh_info *ehi = &ap->eh_info;
- struct ata_eh_context *ehc = &ap->eh_context;
spin_lock_irqsave(ap->lock, flags);
- /* Reset is represented by combination of actions and EHI
- * flags. Suck in all related bits before clearing eh_info to
- * avoid losing requested action.
- */
- if (action & ATA_EH_RESET_MASK) {
- ehc->i.action |= ehi->action & ATA_EH_RESET_MASK;
- ehc->i.flags |= ehi->flags & ATA_EHI_RESET_MODIFIER_MASK;
-
- /* make sure all reset actions are cleared & clear EHI flags */
- action |= ATA_EH_RESET_MASK;
- ehi->flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
- }
-
- ata_eh_clear_action(dev, ehi, action);
+ ata_eh_clear_action(dev, &ap->eh_info, action);
- if (!(ehc->i.flags & ATA_EHI_QUIET))
+ if (!(ap->eh_context.i.flags & ATA_EHI_QUIET))
ap->pflags |= ATA_PFLAG_RECOVERED;
spin_unlock_irqrestore(ap->lock, flags);
@@ -805,12 +790,6 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev,
static void ata_eh_done(struct ata_port *ap, struct ata_device *dev,
unsigned int action)
{
- /* if reset is complete, clear all reset actions & reset modifier */
- if (action & ATA_EH_RESET_MASK) {
- action |= ATA_EH_RESET_MASK;
- ap->eh_context.i.flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
- }
-
ata_eh_clear_action(dev, &ap->eh_context.i, action);
}
@@ -1297,6 +1276,8 @@ static int ata_eh_speed_down(struct ata_device *dev, int is_io,
static void ata_eh_autopsy(struct ata_port *ap)
{
struct ata_eh_context *ehc = &ap->eh_context;
+ unsigned int action = ehc->i.action;
+ struct ata_device *failed_dev = NULL;
unsigned int all_err_mask = 0;
int tag, is_io = 0;
u32 serror;
@@ -1313,7 +1294,7 @@ static void ata_eh_autopsy(struct ata_port *ap)
ehc->i.serror |= serror;
ata_eh_analyze_serror(ap);
} else if (rc != -EOPNOTSUPP)
- ehc->i.action |= ATA_EH_HARDRESET;
+ action |= ATA_EH_HARDRESET;
/* analyze NCQ failure */
ata_eh_analyze_ncq_error(ap);
@@ -1334,7 +1315,7 @@ static void ata_eh_autopsy(struct ata_port *ap)
qc->err_mask |= ehc->i.err_mask;
/* analyze TF */
- ehc->i.action |= ata_eh_analyze_tf(qc, &qc->result_tf);
+ action |= ata_eh_analyze_tf(qc, &qc->result_tf);
/* DEV errors are probably spurious in case of ATA_BUS error */
if (qc->err_mask & AC_ERR_ATA_BUS)
@@ -1348,11 +1329,11 @@ static void ata_eh_autopsy(struct ata_port *ap)
/* SENSE_VALID trumps dev/unknown error and revalidation */
if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
- ehc->i.action &= ~ATA_EH_REVALIDATE;
+ action &= ~ATA_EH_REVALIDATE;
}
/* accumulate error info */
- ehc->i.dev = qc->dev;
+ failed_dev = qc->dev;
all_err_mask |= qc->err_mask;
if (qc->flags & ATA_QCFLAG_IO)
is_io = 1;
@@ -1361,22 +1342,25 @@ static void ata_eh_autopsy(struct ata_port *ap)
/* enforce default EH actions */
if (ap->pflags & ATA_PFLAG_FROZEN ||
all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
- ehc->i.action |= ATA_EH_SOFTRESET;
+ action |= ATA_EH_SOFTRESET;
else if (all_err_mask)
- ehc->i.action |= ATA_EH_REVALIDATE;
+ action |= ATA_EH_REVALIDATE;
/* if we have offending qcs and the associated failed device */
- if (ehc->i.dev) {
+ if (failed_dev) {
/* speed down */
- ehc->i.action |= ata_eh_speed_down(ehc->i.dev, is_io,
- all_err_mask);
+ action |= ata_eh_speed_down(failed_dev, is_io, all_err_mask);
/* perform per-dev EH action only on the offending device */
- ehc->i.dev_action[ehc->i.dev->devno] |=
- ehc->i.action & ATA_EH_PERDEV_MASK;
- ehc->i.action &= ~ATA_EH_PERDEV_MASK;
+ ehc->i.dev_action[failed_dev->devno] |=
+ action & ATA_EH_PERDEV_MASK;
+ action &= ~ATA_EH_PERDEV_MASK;
}
+ /* record autopsy result */
+ ehc->i.dev = failed_dev;
+ ehc->i.action |= action;
+
DPRINTK("EXIT\n");
}
@@ -1499,9 +1483,6 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
ata_reset_fn_t reset;
int i, did_followup_srst, rc;
- /* about to reset */
- ata_eh_about_to_do(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK);
-
/* Determine which reset to use and record in ehc->i.action.
* prereset() may examine and modify it.
*/
@@ -1550,7 +1531,8 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
ata_port_printk(ap, KERN_INFO, "%s resetting port\n",
reset == softreset ? "soft" : "hard");
- /* mark that this EH session started with reset */
+ /* reset */
+ ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK);
ehc->i.flags |= ATA_EHI_DID_RESET;
rc = ata_do_reset(ap, reset, classes);
@@ -1613,7 +1595,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
postreset(ap, classes);
/* reset successful, schedule revalidation */
- ata_eh_done(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK);
+ ata_eh_done(ap, NULL, ATA_EH_RESET_MASK);
ehc->i.action |= ATA_EH_REVALIDATE;
}
@@ -1866,16 +1848,15 @@ static int ata_eh_skip_recovery(struct ata_port *ap)
for (i = 0; i < ata_port_max_devices(ap); i++) {
struct ata_device *dev = &ap->device[i];
- if (!(dev->flags & ATA_DFLAG_SUSPENDED))
+ if (ata_dev_absent(dev) || ata_dev_ready(dev))
break;
}
if (i == ata_port_max_devices(ap))
return 1;
- /* thaw frozen port, resume link and recover failed devices */
- if ((ap->pflags & ATA_PFLAG_FROZEN) ||
- (ehc->i.flags & ATA_EHI_RESUME_LINK) || ata_port_nr_enabled(ap))
+ /* always thaw frozen port and recover failed devices */
+ if (ap->pflags & ATA_PFLAG_FROZEN || ata_port_nr_enabled(ap))
return 0;
/* skip if class codes for all vacant slots are ATA_DEV_NONE */
diff --git a/trunk/drivers/scsi/sata_promise.c b/trunk/drivers/scsi/sata_promise.c
index 4776f4e55839..64631bd38952 100644
--- a/trunk/drivers/scsi/sata_promise.c
+++ b/trunk/drivers/scsi/sata_promise.c
@@ -269,15 +269,8 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = {
{ PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_20619 },
-/* TODO: remove all associated board_20771 code, as it completely
- * duplicates board_2037x code, unless reason for separation can be
- * divined.
- */
-#if 0
{ PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
board_20771 },
-#endif
-
{ } /* terminate list */
};
diff --git a/trunk/drivers/scsi/scsi_ioctl.c b/trunk/drivers/scsi/scsi_ioctl.c
index 32293f451669..a89c4115cfba 100644
--- a/trunk/drivers/scsi/scsi_ioctl.c
+++ b/trunk/drivers/scsi/scsi_ioctl.c
@@ -110,8 +110,11 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
sshdr.asc, sshdr.ascq);
break;
case NOT_READY: /* This happens if there is no disc in drive */
- if (sdev->removable)
+ if (sdev->removable && (cmd[0] != TEST_UNIT_READY)) {
+ printk(KERN_INFO "Device not ready. Make sure"
+ " there is a disc in the drive.\n");
break;
+ }
case UNIT_ATTENTION:
if (sdev->removable) {
sdev->changed = 1;
diff --git a/trunk/drivers/usb/Kconfig b/trunk/drivers/usb/Kconfig
index 005043197527..2ee742d40c43 100644
--- a/trunk/drivers/usb/Kconfig
+++ b/trunk/drivers/usb/Kconfig
@@ -24,7 +24,7 @@ config USB_ARCH_HAS_OHCI
default y if ARCH_S3C2410
default y if PXA27x
default y if ARCH_EP93XX
- default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261)
+ default y if ARCH_AT91RM9200
# PPC:
default y if STB03xxx
default y if PPC_MPC52xx
diff --git a/trunk/drivers/usb/core/devio.c b/trunk/drivers/usb/core/devio.c
index 218621b9958e..f7bdd94b3aa8 100644
--- a/trunk/drivers/usb/core/devio.c
+++ b/trunk/drivers/usb/core/devio.c
@@ -517,19 +517,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig
static struct usb_device *usbdev_lookup_minor(int minor)
{
- struct class_device *class_dev;
- struct usb_device *dev = NULL;
+ struct device *device;
+ struct usb_device *udev = NULL;
down(&usb_device_class->sem);
- list_for_each_entry(class_dev, &usb_device_class->children, node) {
- if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) {
- dev = class_dev->class_data;
+ list_for_each_entry(device, &usb_device_class->devices, node) {
+ if (device->devt == MKDEV(USB_DEVICE_MAJOR, minor)) {
+ udev = device->platform_data;
break;
}
}
up(&usb_device_class->sem);
- return dev;
+ return udev;
};
/*
@@ -1580,16 +1580,16 @@ static void usbdev_add(struct usb_device *dev)
{
int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1);
- dev->class_dev = class_device_create(usb_device_class, NULL,
- MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev,
+ dev->usbfs_dev = device_create(usb_device_class, &dev->dev,
+ MKDEV(USB_DEVICE_MAJOR, minor),
"usbdev%d.%d", dev->bus->busnum, dev->devnum);
- dev->class_dev->class_data = dev;
+ dev->usbfs_dev->platform_data = dev;
}
static void usbdev_remove(struct usb_device *dev)
{
- class_device_unregister(dev->class_dev);
+ device_unregister(dev->usbfs_dev);
}
static int usbdev_notify(struct notifier_block *self, unsigned long action,
diff --git a/trunk/drivers/usb/core/file.c b/trunk/drivers/usb/core/file.c
index 8de4f8c99d61..abee0f5b6a66 100644
--- a/trunk/drivers/usb/core/file.c
+++ b/trunk/drivers/usb/core/file.c
@@ -194,14 +194,13 @@ int usb_register_dev(struct usb_interface *intf,
++temp;
else
temp = name;
- intf->class_dev = class_device_create(usb_class->class, NULL,
- MKDEV(USB_MAJOR, minor),
- &intf->dev, "%s", temp);
- if (IS_ERR(intf->class_dev)) {
+ intf->usb_dev = device_create(usb_class->class, &intf->dev,
+ MKDEV(USB_MAJOR, minor), "%s", temp);
+ if (IS_ERR(intf->usb_dev)) {
spin_lock (&minor_lock);
usb_minors[intf->minor] = NULL;
spin_unlock (&minor_lock);
- retval = PTR_ERR(intf->class_dev);
+ retval = PTR_ERR(intf->usb_dev);
}
exit:
return retval;
@@ -242,8 +241,8 @@ void usb_deregister_dev(struct usb_interface *intf,
spin_unlock (&minor_lock);
snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base);
- class_device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
- intf->class_dev = NULL;
+ device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor));
+ intf->usb_dev = NULL;
intf->minor = -1;
destroy_usb_class();
}
diff --git a/trunk/drivers/usb/gadget/Kconfig b/trunk/drivers/usb/gadget/Kconfig
index 1a32d96774b4..363b2ad74ae6 100644
--- a/trunk/drivers/usb/gadget/Kconfig
+++ b/trunk/drivers/usb/gadget/Kconfig
@@ -207,7 +207,7 @@ config USB_AT91
config USB_GADGET_DUMMY_HCD
boolean "Dummy HCD (DEVELOPMENT)"
- depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL
+ depends on USB && EXPERIMENTAL
select USB_GADGET_DUALSPEED
help
This host controller driver emulates USB, looping all data transfer
diff --git a/trunk/drivers/usb/gadget/at91_udc.c b/trunk/drivers/usb/gadget/at91_udc.c
index cfebca05ead5..1c459ff037ce 100644
--- a/trunk/drivers/usb/gadget/at91_udc.c
+++ b/trunk/drivers/usb/gadget/at91_udc.c
@@ -57,23 +57,19 @@
/*
* This controller is simple and PIO-only. It's used in many AT91-series
- * full speed USB controllers, including the at91rm9200 (arm920T, with MMU),
- * at91sam926x (arm926ejs, with MMU), and several no-mmu versions.
+ * ARMv4T controllers, including the at91rm9200 (arm920T, with MMU),
+ * at91sam9261 (arm926ejs, with MMU), and several no-mmu versions.
*
* This driver expects the board has been wired with two GPIOs suppporting
* a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the
- * testing hasn't covered such cases.)
- *
- * The pullup is most important (so it's integrated on sam926x parts). It
+ * testing hasn't covered such cases.) The pullup is most important; it
* provides software control over whether the host enumerates the device.
- *
* The VBUS sensing helps during enumeration, and allows both USB clocks
* (and the transceiver) to stay gated off until they're necessary, saving
- * power. During USB suspend, the 48 MHz clock is gated off in hardware;
- * it may also be gated off by software during some Linux sleep states.
+ * power. During USB suspend, the 48 MHz clock is gated off.
*/
-#define DRIVER_VERSION "3 May 2006"
+#define DRIVER_VERSION "8 March 2005"
static const char driver_name [] = "at91_udc";
static const char ep0name[] = "ep0";
@@ -320,15 +316,9 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status)
*
* There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE
* that shouldn't normally be changed.
- *
- * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains,
- * implying a need to wait for one write to complete (test relevant bits)
- * before starting the next write. This shouldn't be an issue given how
- * infrequently we write, except maybe for write-then-read idioms.
*/
#define SET_FX (AT91_UDP_TXPKTRDY)
-#define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP \
- | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)
+#define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP)
/* pull OUT packet data from the endpoint's fifo */
static int read_fifo (struct at91_ep *ep, struct at91_request *req)
@@ -482,8 +472,7 @@ static void nuke(struct at91_ep *ep, int status)
/*-------------------------------------------------------------------------*/
-static int at91_ep_enable(struct usb_ep *_ep,
- const struct usb_endpoint_descriptor *desc)
+static int at91_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
{
struct at91_ep *ep = container_of(_ep, struct at91_ep, ep);
struct at91_udc *dev = ep->udc;
@@ -593,12 +582,11 @@ static int at91_ep_disable (struct usb_ep * _ep)
* interesting for request or buffer allocation.
*/
-static struct usb_request *
-at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags)
+static struct usb_request *at91_ep_alloc_request (struct usb_ep *_ep, unsigned int gfp_flags)
{
struct at91_request *req;
- req = kcalloc(1, sizeof (struct at91_request), gfp_flags);
+ req = kcalloc(1, sizeof (struct at91_request), SLAB_KERNEL);
if (!req)
return NULL;
@@ -874,7 +862,6 @@ static void stop_activity(struct at91_udc *udc)
if (udc->gadget.speed == USB_SPEED_UNKNOWN)
driver = NULL;
udc->gadget.speed = USB_SPEED_UNKNOWN;
- udc->suspended = 0;
for (i = 0; i < NUM_ENDPOINTS; i++) {
struct at91_ep *ep = &udc->ep[i];
@@ -902,8 +889,8 @@ static void clk_off(struct at91_udc *udc)
return;
udc->clocked = 0;
udc->gadget.speed = USB_SPEED_UNKNOWN;
- clk_disable(udc->fclk);
clk_disable(udc->iclk);
+ clk_disable(udc->fclk);
}
/*
@@ -924,6 +911,9 @@ static void pullup(struct at91_udc *udc, int is_on)
at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
at91_set_gpio_value(udc->board.pullup_pin, 0);
clk_off(udc);
+
+ // REVISIT: with transceiver disabled, will D- float
+ // so that a host would falsely detect a device?
}
}
@@ -1300,8 +1290,7 @@ static void handle_ep0(struct at91_udc *udc)
if (udc->wait_for_addr_ack) {
u32 tmp;
- at91_udp_write(AT91_UDP_FADDR,
- AT91_UDP_FEN | udc->addr);
+ at91_udp_write(AT91_UDP_FADDR, AT91_UDP_FEN | udc->addr);
tmp = at91_udp_read(AT91_UDP_GLB_STAT);
tmp &= ~AT91_UDP_FADDEN;
if (udc->addr)
@@ -1372,10 +1361,9 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
u32 rescans = 5;
while (rescans--) {
- u32 status;
+ u32 status = at91_udp_read(AT91_UDP_ISR);
- status = at91_udp_read(AT91_UDP_ISR)
- & at91_udp_read(AT91_UDP_IMR);
+ status &= at91_udp_read(AT91_UDP_IMR);
if (!status)
break;
@@ -1391,17 +1379,18 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
stop_activity(udc);
/* enable ep0 */
- at91_udp_write(AT91_UDP_CSR(0),
- AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL);
+ at91_udp_write(AT91_UDP_CSR(0), AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL);
udc->gadget.speed = USB_SPEED_FULL;
udc->suspended = 0;
at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0));
/*
* NOTE: this driver keeps clocks off unless the
- * USB host is present. That saves power, but for
- * boards that don't support VBUS detection, both
- * clocks need to be active most of the time.
+ * USB host is present. That saves power, and also
+ * eliminates IRQs (reset, resume, suspend) that can
+ * otherwise flood from the controller. If your
+ * board doesn't support VBUS detection, suspend and
+ * resume irq logic may need more attention...
*/
/* host initiated suspend (3+ms bus idle) */
@@ -1463,19 +1452,13 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r)
/*-------------------------------------------------------------------------*/
-static void nop_release(struct device *dev)
-{
- /* nothing to free */
-}
-
static struct at91_udc controller = {
.gadget = {
- .ops = &at91_udc_ops,
- .ep0 = &controller.ep[0].ep,
- .name = driver_name,
- .dev = {
- .bus_id = "gadget",
- .release = nop_release,
+ .ops = &at91_udc_ops,
+ .ep0 = &controller.ep[0].ep,
+ .name = driver_name,
+ .dev = {
+ .bus_id = "gadget"
}
},
.ep[0] = {
@@ -1485,8 +1468,7 @@ static struct at91_udc controller = {
},
.udc = &controller,
.maxpacket = 8,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(0)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(0)),
.int_mask = 1 << 0,
},
.ep[1] = {
@@ -1497,8 +1479,7 @@ static struct at91_udc controller = {
.udc = &controller,
.is_pingpong = 1,
.maxpacket = 64,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(1)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(1)),
.int_mask = 1 << 1,
},
.ep[2] = {
@@ -1509,8 +1490,7 @@ static struct at91_udc controller = {
.udc = &controller,
.is_pingpong = 1,
.maxpacket = 64,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(2)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(2)),
.int_mask = 1 << 2,
},
.ep[3] = {
@@ -1521,8 +1501,7 @@ static struct at91_udc controller = {
},
.udc = &controller,
.maxpacket = 8,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(3)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(3)),
.int_mask = 1 << 3,
},
.ep[4] = {
@@ -1533,8 +1512,7 @@ static struct at91_udc controller = {
.udc = &controller,
.is_pingpong = 1,
.maxpacket = 256,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(4)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(4)),
.int_mask = 1 << 4,
},
.ep[5] = {
@@ -1545,11 +1523,10 @@ static struct at91_udc controller = {
.udc = &controller,
.is_pingpong = 1,
.maxpacket = 256,
- .creg = (void __iomem *)(AT91_VA_BASE_UDP
- + AT91_UDP_CSR(5)),
+ .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(5)),
.int_mask = 1 << 5,
},
- /* ep6 and ep7 are also reserved (custom silicon might use them) */
+ /* ep6 and ep7 are also reserved */
};
static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r)
@@ -1616,7 +1593,6 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
local_irq_disable();
udc->enabled = 0;
- at91_udp_write(AT91_UDP_IDR, ~0);
pullup(udc, 0);
local_irq_enable();
@@ -1648,16 +1624,6 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
return -ENODEV;
}
- if (pdev->num_resources != 2) {
- DBG("invalid num_resources");
- return -ENODEV;
- }
- if ((pdev->resource[0].flags != IORESOURCE_MEM)
- || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
- DBG("invalid resource type");
- return -ENODEV;
- }
-
if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) {
DBG("someone's using UDC memory\n");
return -EBUSY;
@@ -1683,26 +1649,19 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
if (retval < 0)
goto fail0;
- /* don't do anything until we have both gadget driver and VBUS */
- clk_enable(udc->iclk);
- at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
- at91_udp_write(AT91_UDP_IDR, 0xffffffff);
- clk_disable(udc->iclk);
+ /* disable everything until there's a gadget driver and vbus */
+ pullup(udc, 0);
/* request UDC and maybe VBUS irqs */
- udc->udp_irq = platform_get_irq(pdev, 0);
- if (request_irq(udc->udp_irq, at91_udc_irq,
- IRQF_DISABLED, driver_name, udc)) {
- DBG("request irq %d failed\n", udc->udp_irq);
+ if (request_irq(AT91_ID_UDP, at91_udc_irq, IRQF_DISABLED, driver_name, udc)) {
+ DBG("request irq %d failed\n", AT91_ID_UDP);
retval = -EBUSY;
goto fail1;
}
if (udc->board.vbus_pin > 0) {
- if (request_irq(udc->board.vbus_pin, at91_vbus_irq,
- IRQF_DISABLED, driver_name, udc)) {
- DBG("request vbus irq %d failed\n",
- udc->board.vbus_pin);
- free_irq(udc->udp_irq, udc);
+ if (request_irq(udc->board.vbus_pin, at91_vbus_irq, IRQF_DISABLED, driver_name, udc)) {
+ DBG("request vbus irq %d failed\n", udc->board.vbus_pin);
+ free_irq(AT91_ID_UDP, udc);
retval = -EBUSY;
goto fail1;
}
@@ -1711,7 +1670,6 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
udc->vbus = 1;
}
dev_set_drvdata(dev, udc);
- device_init_wakeup(dev, 1);
create_debug_file(udc);
INFO("%s version %s\n", driver_name, DRIVER_VERSION);
@@ -1720,14 +1678,14 @@ static int __devinit at91udc_probe(struct platform_device *pdev)
fail1:
device_unregister(&udc->gadget.dev);
fail0:
- release_mem_region(AT91_BASE_UDP, SZ_16K);
+ release_mem_region(AT91_VA_BASE_UDP, SZ_16K);
DBG("%s probe failed, %d\n", driver_name, retval);
return retval;
}
-static int __devexit at91udc_remove(struct platform_device *pdev)
+static int __devexit at91udc_remove(struct platform_device *dev)
{
- struct at91_udc *udc = platform_get_drvdata(pdev);
+ struct at91_udc *udc = platform_get_drvdata(dev);
DBG("remove\n");
@@ -1736,11 +1694,10 @@ static int __devexit at91udc_remove(struct platform_device *pdev)
if (udc->driver != 0)
usb_gadget_unregister_driver(udc->driver);
- device_init_wakeup(&pdev->dev, 0);
remove_debug_file(udc);
if (udc->board.vbus_pin > 0)
free_irq(udc->board.vbus_pin, udc);
- free_irq(udc->udp_irq, udc);
+ free_irq(AT91_ID_UDP, udc);
device_unregister(&udc->gadget.dev);
release_mem_region(AT91_BASE_UDP, SZ_16K);
@@ -1751,36 +1708,31 @@ static int __devexit at91udc_remove(struct platform_device *pdev)
}
#ifdef CONFIG_PM
-static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg)
+static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg)
{
- struct at91_udc *udc = platform_get_drvdata(pdev);
- int wake = udc->driver && device_may_wakeup(&pdev->dev);
+ struct at91_udc *udc = platform_get_drvdata(dev);
- /* Unless we can act normally to the host (letting it wake us up
- * whenever it has work for us) force disconnect. Wakeup requires
- * PLLB for USB events (signaling for reset, wakeup, or incoming
- * tokens) and VBUS irqs (on systems which support them).
+ /*
+ * The "safe" suspend transitions are opportunistic ... e.g. when
+ * the USB link is suspended (48MHz clock autogated off), or when
+ * it's disconnected (programmatically gated off, elsewhere).
+ * Then we can suspend, and the chip can enter slow clock mode.
+ *
+ * The problem case is some component (user mode?) suspending this
+ * device while it's active, with the 48 MHz clock in use. There
+ * are two basic approaches: (a) veto suspend levels involving slow
+ * clock mode, (b) disconnect, so 48 MHz will no longer be in use
+ * and we can enter slow clock mode. This uses (b) for now, since
+ * it's simplest until AT91 PM exists and supports the other option.
*/
- if ((!udc->suspended && udc->addr)
- || !wake
- || at91_suspend_entering_slow_clock()) {
+ if (udc->vbus && !udc->suspended)
pullup(udc, 0);
- disable_irq_wake(udc->udp_irq);
- } else
- enable_irq_wake(udc->udp_irq);
-
- if (udc->board.vbus_pin > 0) {
- if (wake)
- enable_irq_wake(udc->board.vbus_pin);
- else
- disable_irq_wake(udc->board.vbus_pin);
- }
return 0;
}
-static int at91udc_resume(struct platform_device *pdev)
+static int at91udc_resume(struct platform_device *dev)
{
- struct at91_udc *udc = platform_get_drvdata(pdev);
+ struct at91_udc *udc = platform_get_drvdata(dev);
/* maybe reconnect to host; if so, clocks on */
pullup(udc, 1);
@@ -1796,7 +1748,7 @@ static struct platform_driver at91_udc = {
.remove = __devexit_p(at91udc_remove),
.shutdown = at91udc_shutdown,
.suspend = at91udc_suspend,
- .resume = at91udc_resume,
+ .resume = at91udc_resume,
.driver = {
.name = (char *) driver_name,
.owner = THIS_MODULE,
@@ -1815,6 +1767,6 @@ static void __devexit udc_exit_module(void)
}
module_exit(udc_exit_module);
-MODULE_DESCRIPTION("AT91 udc driver");
+MODULE_DESCRIPTION("AT91RM9200 udc driver");
MODULE_AUTHOR("Thomas Rathbone, David Brownell");
MODULE_LICENSE("GPL");
diff --git a/trunk/drivers/usb/gadget/at91_udc.h b/trunk/drivers/usb/gadget/at91_udc.h
index 882af42e86cc..5a4799cedd19 100644
--- a/trunk/drivers/usb/gadget/at91_udc.h
+++ b/trunk/drivers/usb/gadget/at91_udc.h
@@ -141,7 +141,6 @@ struct at91_udc {
struct clk *iclk, *fclk;
struct platform_device *pdev;
struct proc_dir_entry *pde;
- int udp_irq;
};
static inline struct at91_udc *to_udc(struct usb_gadget *g)
diff --git a/trunk/drivers/usb/gadget/dummy_hcd.c b/trunk/drivers/usb/gadget/dummy_hcd.c
index 7d1c22c34957..4be47195bd38 100644
--- a/trunk/drivers/usb/gadget/dummy_hcd.c
+++ b/trunk/drivers/usb/gadget/dummy_hcd.c
@@ -609,8 +609,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
if (!dum->driver)
return -ESHUTDOWN;
- local_irq_save (flags);
- spin_lock (&dum->lock);
+ spin_lock_irqsave (&dum->lock, flags);
list_for_each_entry (req, &ep->queue, queue) {
if (&req->req == _req) {
list_del_init (&req->queue);
@@ -619,7 +618,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
break;
}
}
- spin_unlock (&dum->lock);
+ spin_unlock_irqrestore (&dum->lock, flags);
if (retval == 0) {
dev_dbg (udc_dev(dum),
@@ -627,7 +626,6 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req)
req, _ep->name, _req->length, _req->buf);
_req->complete (_ep, _req);
}
- local_irq_restore (flags);
return retval;
}
diff --git a/trunk/drivers/usb/host/ehci-hcd.c b/trunk/drivers/usb/host/ehci-hcd.c
index d63177a8eaea..85b0b4ad4c16 100644
--- a/trunk/drivers/usb/host/ehci-hcd.c
+++ b/trunk/drivers/usb/host/ehci-hcd.c
@@ -892,7 +892,7 @@ MODULE_LICENSE ("GPL");
#define PCI_DRIVER ehci_pci_driver
#endif
-#ifdef CONFIG_MPC834x
+#ifdef CONFIG_PPC_83xx
#include "ehci-fsl.c"
#define PLATFORM_DRIVER ehci_fsl_driver
#endif
diff --git a/trunk/drivers/usb/host/ohci-at91.c b/trunk/drivers/usb/host/ohci-at91.c
index 85cc059705a6..cdbafb710000 100644
--- a/trunk/drivers/usb/host/ohci-at91.c
+++ b/trunk/drivers/usb/host/ohci-at91.c
@@ -4,7 +4,7 @@
* Copyright (C) 2004 SAN People (Pty) Ltd.
* Copyright (C) 2005 Thibaut VARENE
*
- * AT91 Bus Glue
+ * AT91RM9200 Bus Glue
*
* Based on fragments of 2.4 driver by Rick Bronson.
* Based on ohci-omap.c
@@ -19,13 +19,12 @@
#include
#include
-#ifndef CONFIG_ARCH_AT91
-#error "CONFIG_ARCH_AT91 must be defined."
+#ifndef CONFIG_ARCH_AT91RM9200
+#error "CONFIG_ARCH_AT91RM9200 must be defined."
#endif
/* interface and function clocks */
static struct clk *iclk, *fclk;
-static int clocked;
extern int usb_disabled(void);
@@ -36,14 +35,13 @@ static void at91_start_hc(struct platform_device *pdev)
struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_regs __iomem *regs = hcd->regs;
- dev_dbg(&pdev->dev, "start\n");
+ dev_dbg(&pdev->dev, "starting AT91RM9200 OHCI USB Controller\n");
/*
* Start the USB clocks.
*/
clk_enable(iclk);
clk_enable(fclk);
- clocked = 1;
/*
* The USB host controller must remain in reset.
@@ -56,7 +54,7 @@ static void at91_stop_hc(struct platform_device *pdev)
struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_regs __iomem *regs = hcd->regs;
- dev_dbg(&pdev->dev, "stop\n");
+ dev_dbg(&pdev->dev, "stopping AT91RM9200 OHCI USB Controller\n");
/*
* Put the USB host controller into reset.
@@ -68,7 +66,6 @@ static void at91_stop_hc(struct platform_device *pdev)
*/
clk_disable(fclk);
clk_disable(iclk);
- clocked = 0;
}
@@ -81,15 +78,14 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *);
/**
- * usb_hcd_at91_probe - initialize AT91-based HCDs
+ * usb_hcd_at91_probe - initialize AT91RM9200-based HCDs
* Context: !in_interrupt()
*
* Allocates basic resources for this USB host controller, and
* then invokes the start() method for the HCD associated with it
* through the hotplug entry's driver_data.
*/
-static int usb_hcd_at91_probe(const struct hc_driver *driver,
- struct platform_device *pdev)
+int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev)
{
int retval;
struct usb_hcd *hcd = NULL;
@@ -99,13 +95,12 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
return -ENODEV;
}
- if ((pdev->resource[0].flags != IORESOURCE_MEM)
- || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
+ if ((pdev->resource[0].flags != IORESOURCE_MEM) || (pdev->resource[1].flags != IORESOURCE_IRQ)) {
pr_debug("hcd probe: invalid resource type\n");
return -ENODEV;
}
- hcd = usb_create_hcd(driver, &pdev->dev, "at91");
+ hcd = usb_create_hcd(driver, &pdev->dev, "at91rm9200");
if (!hcd)
return -ENOMEM;
hcd->rsrc_start = pdev->resource[0].start;
@@ -154,23 +149,21 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
/* may be called with controller, bus, and devices active */
/**
- * usb_hcd_at91_remove - shutdown processing for AT91-based HCDs
+ * usb_hcd_at91_remove - shutdown processing for AT91RM9200-based HCDs
* @dev: USB Host Controller being removed
* Context: !in_interrupt()
*
* Reverses the effect of usb_hcd_at91_probe(), first invoking
* the HCD's stop() method. It is always called from a thread
- * context, "rmmod" or something similar.
+ * context, normally "rmmod", "apmd", or something similar.
*
*/
-static int usb_hcd_at91_remove(struct usb_hcd *hcd,
- struct platform_device *pdev)
+static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pdev)
{
usb_remove_hcd(hcd);
at91_stop_hc(pdev);
iounmap(hcd->regs);
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
- disable_irq_wake(hcd->irq);
clk_put(fclk);
clk_put(iclk);
@@ -185,21 +178,19 @@ static int usb_hcd_at91_remove(struct usb_hcd *hcd,
static int __devinit
ohci_at91_start (struct usb_hcd *hcd)
{
- struct at91_usbh_data *board = hcd->self.controller->platform_data;
+// struct at91_ohci_data *board = hcd->self.controller->platform_data;
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
- struct usb_device *root = hcd->self.root_hub;
int ret;
if ((ret = ohci_init(ohci)) < 0)
return ret;
- root->maxchild = board->ports;
-
if ((ret = ohci_run(ohci)) < 0) {
err("can't start %s", hcd->self.bus_name);
ohci_stop(hcd);
return ret;
}
+// hcd->self.root_hub->maxchild = board->ports;
return 0;
}
@@ -207,7 +198,7 @@ ohci_at91_start (struct usb_hcd *hcd)
static const struct hc_driver ohci_at91_hc_driver = {
.description = hcd_name,
- .product_desc = "AT91 OHCI",
+ .product_desc = "AT91RM9200 OHCI",
.hcd_priv_size = sizeof(struct ohci_hcd),
/*
@@ -249,54 +240,33 @@ static const struct hc_driver ohci_at91_hc_driver = {
/*-------------------------------------------------------------------------*/
-static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
+static int ohci_hcd_at91_drv_probe(struct platform_device *dev)
{
- device_init_wakeup(&pdev->dev, 1);
- return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev);
+ return usb_hcd_at91_probe(&ohci_at91_hc_driver, dev);
}
-static int ohci_hcd_at91_drv_remove(struct platform_device *pdev)
+static int ohci_hcd_at91_drv_remove(struct platform_device *dev)
{
- device_init_wakeup(&pdev->dev, 0);
- return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev);
+ return usb_hcd_at91_remove(platform_get_drvdata(dev), dev);
}
#ifdef CONFIG_PM
+/* REVISIT suspend/resume look "too" simple here */
+
static int
-ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg)
+ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg)
{
- struct usb_hcd *hcd = platform_get_drvdata(pdev);
- struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-
- if (device_may_wakeup(&pdev->dev))
- enable_irq_wake(hcd->irq);
- else
- disable_irq_wake(hcd->irq);
-
- /*
- * The integrated transceivers seem unable to notice disconnect,
- * reconnect, or wakeup without the 48 MHz clock active. so for
- * correctness, always discard connection state (using reset).
- *
- * REVISIT: some boards will be able to turn VBUS off...
- */
- if (at91_suspend_entering_slow_clock()) {
- ohci_usb_reset (ohci);
- clk_disable(fclk);
- clk_disable(iclk);
- clocked = 0;
- }
+ clk_disable(fclk);
+ clk_disable(iclk);
return 0;
}
-static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
+static int ohci_hcd_at91_drv_resume(struct platform_device *dev)
{
- if (!clocked) {
- clk_enable(iclk);
- clk_enable(fclk);
- }
+ clk_enable(iclk);
+ clk_enable(fclk);
return 0;
}
@@ -305,7 +275,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
#define ohci_hcd_at91_drv_resume NULL
#endif
-MODULE_ALIAS("at91_ohci");
+MODULE_ALIAS("at91rm9200-ohci");
static struct platform_driver ohci_hcd_at91_driver = {
.probe = ohci_hcd_at91_drv_probe,
@@ -313,7 +283,7 @@ static struct platform_driver ohci_hcd_at91_driver = {
.suspend = ohci_hcd_at91_drv_suspend,
.resume = ohci_hcd_at91_drv_resume,
.driver = {
- .name = "at91_ohci",
+ .name = "at91rm9200-ohci",
.owner = THIS_MODULE,
},
};
diff --git a/trunk/drivers/usb/host/ohci-hcd.c b/trunk/drivers/usb/host/ohci-hcd.c
index 94d8cf4b36c1..afef5ac35b4a 100644
--- a/trunk/drivers/usb/host/ohci-hcd.c
+++ b/trunk/drivers/usb/host/ohci-hcd.c
@@ -913,7 +913,7 @@ MODULE_LICENSE ("GPL");
#include "ohci-ppc-soc.c"
#endif
-#if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261)
+#ifdef CONFIG_ARCH_AT91RM9200
#include "ohci-at91.c"
#endif
@@ -927,7 +927,6 @@ MODULE_LICENSE ("GPL");
|| defined (CONFIG_SOC_AU1X00) \
|| defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
|| defined (CONFIG_ARCH_AT91RM9200) \
- || defined (CONFIG_ARCH_AT91SAM9261) \
)
#error "missing bus glue for ohci-hcd"
#endif
diff --git a/trunk/drivers/usb/host/uhci-q.c b/trunk/drivers/usb/host/uhci-q.c
index 66c3f61bc9d1..c9d72ac0a1d7 100644
--- a/trunk/drivers/usb/host/uhci-q.c
+++ b/trunk/drivers/usb/host/uhci-q.c
@@ -943,9 +943,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb)
/* We received a short packet */
if (urb->transfer_flags & URB_SHORT_NOT_OK)
ret = -EREMOTEIO;
-
- /* Fixup needed only if this isn't the URB's last TD */
- else if (&td->list != urbp->td_list.prev)
+ else if (ctrlstat & TD_CTRL_SPD)
ret = 1;
}
diff --git a/trunk/drivers/usb/input/ati_remote.c b/trunk/drivers/usb/input/ati_remote.c
index df198cf76f52..05d2d6012eb2 100644
--- a/trunk/drivers/usb/input/ati_remote.c
+++ b/trunk/drivers/usb/input/ati_remote.c
@@ -152,8 +152,9 @@ static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 };
* events. The hardware generates 5 events for the first keypress
* and we have to take this into account for an accurate repeat
* behaviour.
+ * (HZ / 20) == 50 ms and works well for me.
*/
-#define FILTER_TIME 60 /* msec */
+#define FILTER_TIME (HZ / 20)
struct ati_remote {
struct input_dev *idev;
@@ -466,7 +467,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
/* Filter duplicate events which happen "too close" together. */
if ((ati_remote->old_data[0] == data[1]) &&
(ati_remote->old_data[1] == data[2]) &&
- time_before(jiffies, ati_remote->old_jiffies + msecs_to_jiffies(FILTER_TIME))) {
+ time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) {
ati_remote->repeat_count++;
} else {
ati_remote->repeat_count = 0;
diff --git a/trunk/drivers/usb/misc/cypress_cy7c63.c b/trunk/drivers/usb/misc/cypress_cy7c63.c
index a4062a6adbb8..e091d327bd9e 100644
--- a/trunk/drivers/usb/misc/cypress_cy7c63.c
+++ b/trunk/drivers/usb/misc/cypress_cy7c63.c
@@ -12,13 +12,8 @@
* the single I/O ports of the device.
*
* Supported vendors: AK Modul-Bus Computer GmbH
-* (Firmware "Port-Chip")
-*
-* Supported devices: CY7C63001A-PC
-* CY7C63001C-PXC
-* CY7C63001C-SXC
-*
-* Supported functions: Read/Write Ports
+* Supported devices: CY7C63001A-PC (to be continued...)
+* Supported functions: Read/Write Ports (to be continued...)
*
*
* This program is free software; you can redistribute it and/or
diff --git a/trunk/drivers/usb/net/rtl8150.c b/trunk/drivers/usb/net/rtl8150.c
index bd09232ce13c..e5e6e4f3ef87 100644
--- a/trunk/drivers/usb/net/rtl8150.c
+++ b/trunk/drivers/usb/net/rtl8150.c
@@ -175,8 +175,6 @@ static inline struct sk_buff *pull_skb(rtl8150_t *);
static void rtl8150_disconnect(struct usb_interface *intf);
static int rtl8150_probe(struct usb_interface *intf,
const struct usb_device_id *id);
-static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message);
-static int rtl8150_resume(struct usb_interface *intf);
static const char driver_name [] = "rtl8150";
@@ -185,8 +183,6 @@ static struct usb_driver rtl8150_driver = {
.probe = rtl8150_probe,
.disconnect = rtl8150_disconnect,
.id_table = rtl8150_table,
- .suspend = rtl8150_suspend,
- .resume = rtl8150_resume
};
/*
@@ -242,11 +238,9 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size)
usb_fill_control_urb(dev->ctrl_urb, dev->udev,
usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr,
&dev->rx_creg, size, ctrl_callback, dev);
- if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) {
- if (ret == -ENODEV)
- netif_device_detach(dev->netdev);
+ if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC)))
err("control request submission failed: %d", ret);
- } else
+ else
set_bit(RX_REG_SET, &dev->flags);
return ret;
@@ -422,7 +416,6 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
struct sk_buff *skb;
struct net_device *netdev;
u16 rx_stat;
- int status;
dev = urb->context;
if (!dev)
@@ -472,10 +465,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs)
goon:
usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
- status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC);
- if (status == -ENODEV)
- netif_device_detach(dev->netdev);
- else if (status) {
+ if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
set_bit(RX_URB_FAIL, &dev->flags);
goto resched;
} else {
@@ -491,7 +481,6 @@ static void rx_fixup(unsigned long data)
{
rtl8150_t *dev;
struct sk_buff *skb;
- int status;
dev = (rtl8150_t *)data;
@@ -510,13 +499,10 @@ static void rx_fixup(unsigned long data)
usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
try_again:
- status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC);
- if (status == -ENODEV) {
- netif_device_detach(dev->netdev);
- } else if (status) {
+ if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) {
set_bit(RX_URB_FAIL, &dev->flags);
goto tlsched;
- } else {
+ } else {
clear_bit(RX_URB_FAIL, &dev->flags);
}
@@ -588,43 +574,12 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs)
resubmit:
status = usb_submit_urb (urb, SLAB_ATOMIC);
- if (status == -ENODEV)
- netif_device_detach(dev->netdev);
- else if (status)
+ if (status)
err ("can't resubmit intr, %s-%s/input0, status %d",
dev->udev->bus->bus_name,
dev->udev->devpath, status);
}
-static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message)
-{
- rtl8150_t *dev = usb_get_intfdata(intf);
-
- netif_device_detach(dev->netdev);
-
- if (netif_running(dev->netdev)) {
- usb_kill_urb(dev->rx_urb);
- usb_kill_urb(dev->intr_urb);
- }
- return 0;
-}
-
-static int rtl8150_resume(struct usb_interface *intf)
-{
- rtl8150_t *dev = usb_get_intfdata(intf);
-
- netif_device_attach(dev->netdev);
- if (netif_running(dev->netdev)) {
- dev->rx_urb->status = 0;
- dev->rx_urb->actual_length = 0;
- read_bulk_callback(dev->rx_urb, NULL);
-
- dev->intr_urb->status = 0;
- dev->intr_urb->actual_length = 0;
- intr_callback(dev->intr_urb, NULL);
- }
- return 0;
-}
/*
**
@@ -735,14 +690,9 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev)
usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2),
skb->data, count, write_bulk_callback, dev);
if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) {
- /* Can we get/handle EPIPE here? */
- if (res == -ENODEV)
- netif_device_detach(dev->netdev);
- else {
- warn("failed tx_urb %d\n", res);
- dev->stats.tx_errors++;
- netif_start_queue(netdev);
- }
+ warn("failed tx_urb %d\n", res);
+ dev->stats.tx_errors++;
+ netif_start_queue(netdev);
} else {
dev->stats.tx_packets++;
dev->stats.tx_bytes += skb->len;
@@ -779,25 +729,16 @@ static int rtl8150_open(struct net_device *netdev)
usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1),
dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev);
- if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) {
- if (res == -ENODEV)
- netif_device_detach(dev->netdev);
+ if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL)))
warn("%s: rx_urb submit failed: %d", __FUNCTION__, res);
- return res;
- }
usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3),
dev->intr_buff, INTBUFSIZE, intr_callback,
dev, dev->intr_interval);
- if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) {
- if (res == -ENODEV)
- netif_device_detach(dev->netdev);
+ if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL)))
warn("%s: intr_urb submit failed: %d", __FUNCTION__, res);
- usb_kill_urb(dev->rx_urb);
- return res;
- }
+ netif_start_queue(netdev);
enable_net_traffic(dev);
set_carrier(netdev);
- netif_start_queue(netdev);
return res;
}
diff --git a/trunk/drivers/usb/serial/Kconfig b/trunk/drivers/usb/serial/Kconfig
index f5b9438c94f0..ac33bd47cfce 100644
--- a/trunk/drivers/usb/serial/Kconfig
+++ b/trunk/drivers/usb/serial/Kconfig
@@ -62,6 +62,15 @@ config USB_SERIAL_AIRPRIME
To compile this driver as a module, choose M here: the
module will be called airprime.
+config USB_SERIAL_ANYDATA
+ tristate "USB AnyData CDMA Wireless Driver"
+ depends on USB_SERIAL
+ help
+ Say Y here if you want to use a AnyData CDMA device.
+
+ To compile this driver as a module, choose M here: the
+ module will be called anydata.
+
config USB_SERIAL_ARK3116
tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)"
depends on USB_SERIAL && EXPERIMENTAL
@@ -493,18 +502,15 @@ config USB_SERIAL_XIRCOM
module will be called keyspan_pda.
config USB_SERIAL_OPTION
- tristate "USB driver for GSM and CDMA modems"
+ tristate "USB driver for GSM modems"
depends on USB_SERIAL
help
- Say Y here if you have a GSM or CDMA modem that's connected to USB.
-
- This driver also supports several PCMCIA cards which have a
- built-in OHCI-USB adapter and an internally-connected GSM modem.
- The USB bus on these cards is not accessible externally.
+ Say Y here if you have an "Option" GSM PCMCIA card
+ (or an OEM version: branded Huawei, Audiovox, or Novatel).
- Supported devices include (some of?) those made by:
- Option, Huawei, Audiovox, Sierra Wireless, Novatel Wireless, or
- Anydata.
+ These cards feature a built-in OHCI-USB adapter and an
+ internally-connected GSM modem. The USB bus is not
+ accessible externally.
To compile this driver as a module, choose M here: the
module will be called option.
diff --git a/trunk/drivers/usb/serial/Makefile b/trunk/drivers/usb/serial/Makefile
index 8efed2ce1ba3..35d4acc7f1d3 100644
--- a/trunk/drivers/usb/serial/Makefile
+++ b/trunk/drivers/usb/serial/Makefile
@@ -12,6 +12,7 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o
usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o
+obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o
obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o
obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o
diff --git a/trunk/drivers/usb/serial/anydata.c b/trunk/drivers/usb/serial/anydata.c
new file mode 100644
index 000000000000..01843ef8c11e
--- /dev/null
+++ b/trunk/drivers/usb/serial/anydata.c
@@ -0,0 +1,123 @@
+/*
+ * AnyData CDMA Serial USB driver
+ *
+ * Copyright (C) 2005 Greg Kroah-Hartman
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+static struct usb_device_id id_table [] = {
+ { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */
+ { },
+};
+MODULE_DEVICE_TABLE(usb, id_table);
+
+/* if overridden by the user, then use their value for the size of the
+ * read and write urbs */
+static int buffer_size;
+static int debug;
+
+static struct usb_driver anydata_driver = {
+ .name = "anydata",
+ .probe = usb_serial_probe,
+ .disconnect = usb_serial_disconnect,
+ .id_table = id_table,
+ .no_dynamic_id = 1,
+};
+
+static int anydata_open(struct usb_serial_port *port, struct file *filp)
+{
+ char *buffer;
+ int result = 0;
+
+ dbg("%s - port %d", __FUNCTION__, port->number);
+
+ if (buffer_size) {
+ /* override the default buffer sizes */
+ buffer = kmalloc(buffer_size, GFP_KERNEL);
+ if (!buffer) {
+ dev_err(&port->dev, "%s - out of memory.\n",
+ __FUNCTION__);
+ return -ENOMEM;
+ }
+ kfree (port->read_urb->transfer_buffer);
+ port->read_urb->transfer_buffer = buffer;
+ port->read_urb->transfer_buffer_length = buffer_size;
+
+ buffer = kmalloc(buffer_size, GFP_KERNEL);
+ if (!buffer) {
+ dev_err(&port->dev, "%s - out of memory.\n",
+ __FUNCTION__);
+ return -ENOMEM;
+ }
+ kfree (port->write_urb->transfer_buffer);
+ port->write_urb->transfer_buffer = buffer;
+ port->write_urb->transfer_buffer_length = buffer_size;
+ port->bulk_out_size = buffer_size;
+ }
+
+ /* Start reading from the device */
+ usb_fill_bulk_urb(port->read_urb, port->serial->dev,
+ usb_rcvbulkpipe(port->serial->dev,
+ port->bulk_in_endpointAddress),
+ port->read_urb->transfer_buffer,
+ port->read_urb->transfer_buffer_length,
+ usb_serial_generic_read_bulk_callback, port);
+ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+ __FUNCTION__, result);
+
+ return result;
+}
+
+static struct usb_serial_driver anydata_device = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "anydata",
+ },
+ .id_table = id_table,
+ .num_interrupt_in = NUM_DONT_CARE,
+ .num_bulk_in = NUM_DONT_CARE,
+ .num_bulk_out = NUM_DONT_CARE,
+ .num_ports = 1,
+ .open = anydata_open,
+};
+
+static int __init anydata_init(void)
+{
+ int retval;
+
+ retval = usb_serial_register(&anydata_device);
+ if (retval)
+ return retval;
+ retval = usb_register(&anydata_driver);
+ if (retval)
+ usb_serial_deregister(&anydata_device);
+ return retval;
+}
+
+static void __exit anydata_exit(void)
+{
+ usb_deregister(&anydata_driver);
+ usb_serial_deregister(&anydata_device);
+}
+
+module_init(anydata_init);
+module_exit(anydata_exit);
+MODULE_LICENSE("GPL");
+
+module_param(debug, bool, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(debug, "Debug enabled or not");
+module_param(buffer_size, int, 0);
+MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers");
diff --git a/trunk/drivers/usb/serial/ftdi_sio.c b/trunk/drivers/usb/serial/ftdi_sio.c
index a20da8528a5f..b458aedc5fb6 100644
--- a/trunk/drivers/usb/serial/ftdi_sio.c
+++ b/trunk/drivers/usb/serial/ftdi_sio.c
@@ -337,7 +337,6 @@ static struct usb_device_id id_table_combined [] = {
{ USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) },
{ USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) },
- { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) },
{ USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) },
diff --git a/trunk/drivers/usb/serial/ftdi_sio.h b/trunk/drivers/usb/serial/ftdi_sio.h
index 9f7343a45424..04ef90fcb876 100644
--- a/trunk/drivers/usb/serial/ftdi_sio.h
+++ b/trunk/drivers/usb/serial/ftdi_sio.h
@@ -182,10 +182,6 @@
/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
#define FTDI_USB_UIRT_PID 0xF850 /* Product Id */
-/* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */
-
-#define FTDI_TNC_X_PID 0xEBE0
-
/*
* ELV USB devices submitted by Christian Abt of ELV (www.elv.de).
* All of these devices use FTDI's vendor ID (0x0403).
diff --git a/trunk/drivers/usb/serial/ipaq.c b/trunk/drivers/usb/serial/ipaq.c
index 7e1bd5d6dfa0..59c5d999009a 100644
--- a/trunk/drivers/usb/serial/ipaq.c
+++ b/trunk/drivers/usb/serial/ipaq.c
@@ -250,7 +250,6 @@ static struct usb_device_id ipaq_id_table [] = {
{ USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */
{ USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */
{ USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */
- { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */
{ USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */
{ USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */
{ USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */
diff --git a/trunk/drivers/usb/serial/option.c b/trunk/drivers/usb/serial/option.c
index c856e6f40e22..f0530c1d7b7a 100644
--- a/trunk/drivers/usb/serial/option.c
+++ b/trunk/drivers/usb/serial/option.c
@@ -9,14 +9,40 @@
Portions copied from the Keyspan driver by Hugh Blemings
- History: see the git log.
+ History:
+
+ 2005-05-19 v0.1 Initial version, based on incomplete docs
+ and analysis of misbehavior with the standard driver
+ 2005-05-20 v0.2 Extended the input buffer to avoid losing
+ random 64-byte chunks of data
+ 2005-05-21 v0.3 implemented chars_in_buffer()
+ turned on low_latency
+ simplified the code somewhat
+ 2005-05-24 v0.4 option_write() sometimes deadlocked under heavy load
+ removed some dead code
+ added sponsor notice
+ coding style clean-up
+ 2005-06-20 v0.4.1 add missing braces :-/
+ killed end-of-line whitespace
+ 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2
+ 2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard
+ 2005-09-20 v0.4.4 increased recv buffer size: the card sometimes
+ wants to send >2000 bytes.
+ 2006-04-10 v0.5 fixed two array overrun errors :-/
+ 2006-04-21 v0.5.1 added support for Sierra Wireless MC8755
+ 2006-05-15 v0.6 re-enable multi-port support
+ 2006-06-01 v0.6.1 add COBRA
+ 2006-06-01 v0.6.2 add backwards-compatibility stuff
+ 2006-06-01 v0.6.3 add Novatel Wireless
+ 2006-06-01 v0.7 Option => GSM
+ 2006-06-01 v0.7.1 add COBRA2
Work sponsored by: Sigos GmbH, Germany
This driver exists because the "normal" serial driver doesn't work too well
with GSM modems. Issues:
- data loss -- one single Receive URB is not nearly enough
- - nonstandard flow (Option devices) control
+ - nonstandard flow (Option devices) and multiplex (Sierra) control
- controlling the baud rate doesn't make sense
This driver is named "option" because the most common device it's
@@ -70,8 +96,8 @@ static int option_send_setup(struct usb_serial_port *port);
#define OPTION_VENDOR_ID 0x0AF0
#define HUAWEI_VENDOR_ID 0x12D1
#define AUDIOVOX_VENDOR_ID 0x0F3D
+#define SIERRAWIRELESS_VENDOR_ID 0x1199
#define NOVATELWIRELESS_VENDOR_ID 0x1410
-#define ANYDATA_VENDOR_ID 0x16d5
#define OPTION_PRODUCT_OLD 0x5000
#define OPTION_PRODUCT_FUSION 0x6000
@@ -80,8 +106,8 @@ static int option_send_setup(struct usb_serial_port *port);
#define OPTION_PRODUCT_COBRA2 0x6600
#define HUAWEI_PRODUCT_E600 0x1001
#define AUDIOVOX_PRODUCT_AIRCARD 0x0112
+#define SIERRAWIRELESS_PRODUCT_MC8755 0x6802
#define NOVATELWIRELESS_PRODUCT_U740 0x1400
-#define ANYDATA_PRODUCT_ID 0x6501
static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
@@ -91,8 +117,8 @@ static struct usb_device_id option_ids[] = {
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
+ { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
- { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
{ } /* Terminating entry */
};
@@ -105,7 +131,10 @@ static struct usb_device_id option_ids1[] = {
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) },
- { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) },
+ { } /* Terminating entry */
+};
+static struct usb_device_id option_ids3[] = {
+ { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) },
{ } /* Terminating entry */
};
@@ -122,11 +151,37 @@ static struct usb_driver option_driver = {
/* The card has three separate interfaces, which the serial driver
* recognizes separately, thus num_port=1.
*/
+static struct usb_serial_driver option_3port_device = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "option",
+ },
+ .description = "GSM modem (3-port)",
+ .id_table = option_ids3,
+ .num_interrupt_in = NUM_DONT_CARE,
+ .num_bulk_in = NUM_DONT_CARE,
+ .num_bulk_out = NUM_DONT_CARE,
+ .num_ports = 3,
+ .open = option_open,
+ .close = option_close,
+ .write = option_write,
+ .write_room = option_write_room,
+ .chars_in_buffer = option_chars_in_buffer,
+ .throttle = option_rx_throttle,
+ .unthrottle = option_rx_unthrottle,
+ .set_termios = option_set_termios,
+ .break_ctl = option_break_ctl,
+ .tiocmget = option_tiocmget,
+ .tiocmset = option_tiocmset,
+ .attach = option_startup,
+ .shutdown = option_shutdown,
+ .read_int_callback = option_instat_callback,
+};
static struct usb_serial_driver option_1port_device = {
.driver = {
.owner = THIS_MODULE,
- .name = "option1",
+ .name = "option",
},
.description = "GSM modem (1-port)",
.id_table = option_ids1,
@@ -190,6 +245,9 @@ static int __init option_init(void)
retval = usb_serial_register(&option_1port_device);
if (retval)
goto failed_1port_device_register;
+ retval = usb_serial_register(&option_3port_device);
+ if (retval)
+ goto failed_3port_device_register;
retval = usb_register(&option_driver);
if (retval)
goto failed_driver_register;
@@ -199,6 +257,8 @@ static int __init option_init(void)
return 0;
failed_driver_register:
+ usb_serial_deregister (&option_3port_device);
+failed_3port_device_register:
usb_serial_deregister (&option_1port_device);
failed_1port_device_register:
return retval;
@@ -207,6 +267,7 @@ static int __init option_init(void)
static void __exit option_exit(void)
{
usb_deregister (&option_driver);
+ usb_serial_deregister (&option_3port_device);
usb_serial_deregister (&option_1port_device);
}
@@ -595,6 +656,7 @@ static void option_setup_urbs(struct usb_serial *serial)
dbg("%s", __FUNCTION__);
+
for (i = 0; i < serial->num_ports; i++) {
port = serial->port[i];
portdata = usb_get_serial_port_data(port);
diff --git a/trunk/drivers/usb/serial/pl2303.c b/trunk/drivers/usb/serial/pl2303.c
index efbbc0adb89a..259db31b65c1 100644
--- a/trunk/drivers/usb/serial/pl2303.c
+++ b/trunk/drivers/usb/serial/pl2303.c
@@ -81,7 +81,6 @@ static struct usb_device_id id_table [] = {
{ USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) },
{ USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) },
{ USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) },
- { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) },
{ } /* Terminating entry */
};
diff --git a/trunk/drivers/usb/serial/pl2303.h b/trunk/drivers/usb/serial/pl2303.h
index a692ac66ca6c..d9c1e6e0b4b3 100644
--- a/trunk/drivers/usb/serial/pl2303.h
+++ b/trunk/drivers/usb/serial/pl2303.h
@@ -89,7 +89,3 @@
/* DATAPILOT Universal-2 Phone Cable */
#define DATAPILOT_U2_VENDOR_ID 0x0731
#define DATAPILOT_U2_PRODUCT_ID 0x2003
-
-/* Belkin "F5U257" Serial Adapter */
-#define BELKIN_VENDOR_ID 0x050d
-#define BELKIN_PRODUCT_ID 0x0257
diff --git a/trunk/drivers/usb/storage/unusual_devs.h b/trunk/drivers/usb/storage/unusual_devs.h
index 2793f9a912b4..a5ca449f6e64 100644
--- a/trunk/drivers/usb/storage/unusual_devs.h
+++ b/trunk/drivers/usb/storage/unusual_devs.h
@@ -145,13 +145,6 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100,
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_IGNORE_RESIDUE ),
-/* Reported by Mario Rettig */
-UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100,
- "Nokia",
- "Nokia 3250",
- US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ),
-
/* Reported by Sumedha Swamy and
* Einar Th. Einarsson */
UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100,
@@ -634,6 +627,18 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210,
"Digital Camera EX-20 DSC",
US_SC_8070, US_PR_DEVICE, NULL, 0 ),
+/* The entry was here before I took over, and had US_SC_RBC. It turns
+ * out that isn't needed. Additionally, Torsten Eriksson
+ * is able to use his device fine
+ * without this entry at all - but I don't suspect that will be true
+ * for all users (the protocol is likely needed), so is staying at
+ * this time. - Phil Dibowitz
+ */
+UNUSUAL_DEV( 0x059f, 0xa601, 0x0200, 0x0200,
+ "LaCie",
+ "USB Hard Disk",
+ US_SC_DEVICE, US_PR_CB, NULL, 0 ),
+
/* Submitted by Joel Bourquard
* Some versions of this device need the SubClass and Protocol overrides
* while others don't.
@@ -1101,15 +1106,7 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
"Optio S/S4",
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_FIX_INQUIRY ),
-
-/* This is a virtual windows driver CD, which the zd1211rw driver automatically
- * converts into a WLAN device. */
-UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
- "ZyXEL",
- "G-220F USB-WLAN Install",
- US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_IGNORE_DEVICE ),
-
+
#ifdef CONFIG_USB_STORAGE_ISD200
UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110,
"ATI",
diff --git a/trunk/drivers/usb/storage/usb.c b/trunk/drivers/usb/storage/usb.c
index 8d7bdcb5924d..5ee19be52f65 100644
--- a/trunk/drivers/usb/storage/usb.c
+++ b/trunk/drivers/usb/storage/usb.c
@@ -483,7 +483,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id)
}
/* Get the unusual_devs entries and the string descriptors */
-static int get_device_info(struct us_data *us, const struct usb_device_id *id)
+static void get_device_info(struct us_data *us, const struct usb_device_id *id)
{
struct usb_device *dev = us->pusb_dev;
struct usb_interface_descriptor *idesc =
@@ -500,11 +500,6 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
unusual_dev->useTransport;
us->flags = USB_US_ORIG_FLAGS(id->driver_info);
- if (us->flags & US_FL_IGNORE_DEVICE) {
- printk(KERN_INFO USB_STORAGE "device ignored\n");
- return -ENODEV;
- }
-
/*
* This flag is only needed when we're in high-speed, so let's
* disable it if we're in full-speed
@@ -546,8 +541,6 @@ static int get_device_info(struct us_data *us, const struct usb_device_id *id)
msgs[msg],
UTS_RELEASE);
}
-
- return 0;
}
/* Get the transport settings */
@@ -976,9 +969,7 @@ static int storage_probe(struct usb_interface *intf,
* of the match from the usb_device_id table, so we can find the
* corresponding entry in the private table.
*/
- result = get_device_info(us, id);
- if (result)
- goto BadDevice;
+ get_device_info(us, id);
/* Get the transport, protocol, and pipe settings */
result = get_transport(us);
diff --git a/trunk/drivers/video/Kconfig b/trunk/drivers/video/Kconfig
index c40b9b8b1e7e..6533b0f39231 100644
--- a/trunk/drivers/video/Kconfig
+++ b/trunk/drivers/video/Kconfig
@@ -86,11 +86,9 @@ config FB_MACMODES
default n
config FB_BACKLIGHT
- bool
- depends on FB
- select BACKLIGHT_LCD_SUPPORT
- select BACKLIGHT_CLASS_DEVICE
- default n
+ bool
+ depends on FB
+ default n
config FB_MODE_HELPERS
bool "Enable Video Mode Handling Helpers"
@@ -422,7 +420,7 @@ config FB_OF
config FB_CONTROL
bool "Apple \"control\" display support"
- depends on (FB = y) && PPC_PMAC && PPC32
+ depends on (FB = y) && PPC_PMAC
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
@@ -433,7 +431,7 @@ config FB_CONTROL
config FB_PLATINUM
bool "Apple \"platinum\" display support"
- depends on (FB = y) && PPC_PMAC && PPC32
+ depends on (FB = y) && PPC_PMAC
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
@@ -444,7 +442,7 @@ config FB_PLATINUM
config FB_VALKYRIE
bool "Apple \"valkyrie\" display support"
- depends on (FB = y) && (MAC || (PPC_PMAC && PPC32))
+ depends on (FB = y) && (MAC || PPC_PMAC)
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
@@ -455,7 +453,7 @@ config FB_VALKYRIE
config FB_CT65550
bool "Chips 65550 display support"
- depends on (FB = y) && PPC32
+ depends on (FB = y) && PPC
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
@@ -723,8 +721,10 @@ config FB_NVIDIA_I2C
config FB_NVIDIA_BACKLIGHT
bool "Support for backlight control"
- depends on FB_NVIDIA && PMAC_BACKLIGHT
+ depends on FB_NVIDIA && PPC_PMAC
select FB_BACKLIGHT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
default y
help
Say Y here if you want to control the backlight of your display.
@@ -769,8 +769,10 @@ config FB_RIVA_DEBUG
config FB_RIVA_BACKLIGHT
bool "Support for backlight control"
- depends on FB_RIVA && PMAC_BACKLIGHT
+ depends on FB_RIVA && PPC_PMAC
select FB_BACKLIGHT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
default y
help
Say Y here if you want to control the backlight of your display.
@@ -1023,8 +1025,10 @@ config FB_RADEON_I2C
config FB_RADEON_BACKLIGHT
bool "Support for backlight control"
- depends on FB_RADEON && PMAC_BACKLIGHT
+ depends on FB_RADEON && PPC_PMAC
select FB_BACKLIGHT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
default y
help
Say Y here if you want to control the backlight of your display.
@@ -1055,8 +1059,10 @@ config FB_ATY128
config FB_ATY128_BACKLIGHT
bool "Support for backlight control"
- depends on FB_ATY128 && PMAC_BACKLIGHT
+ depends on FB_ATY128 && PPC_PMAC
select FB_BACKLIGHT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
default y
help
Say Y here if you want to control the backlight of your display.
@@ -1105,8 +1111,10 @@ config FB_ATY_GX
config FB_ATY_BACKLIGHT
bool "Support for backlight control"
- depends on FB_ATY && PMAC_BACKLIGHT
+ depends on FB_ATY && PPC_PMAC
select FB_BACKLIGHT
+ select BACKLIGHT_LCD_SUPPORT
+ select BACKLIGHT_CLASS_DEVICE
default y
help
Say Y here if you want to control the backlight of your display.
@@ -1612,7 +1620,7 @@ if FB || SGI_NEWPORT_CONSOLE
source "drivers/video/logo/Kconfig"
endif
-if SYSFS
+if FB && SYSFS
source "drivers/video/backlight/Kconfig"
endif
diff --git a/trunk/drivers/video/Makefile b/trunk/drivers/video/Makefile
index 481c6c9695f8..95563c9c6b9c 100644
--- a/trunk/drivers/video/Makefile
+++ b/trunk/drivers/video/Makefile
@@ -4,7 +4,6 @@
# Each configuration option enables a list of files.
-obj-y += fb_notify.o
obj-$(CONFIG_FB) += fb.o
fb-y := fbmem.o fbmon.o fbcmap.o fbsysfs.o \
modedb.o fbcvt.o
diff --git a/trunk/drivers/video/aty/aty128fb.c b/trunk/drivers/video/aty/aty128fb.c
index 8b08121b390b..c64a717e2d4b 100644
--- a/trunk/drivers/video/aty/aty128fb.c
+++ b/trunk/drivers/video/aty/aty128fb.c
@@ -455,10 +455,7 @@ static void do_wait_for_fifo(u16 entries, struct aty128fb_par *par);
static void wait_for_fifo(u16 entries, struct aty128fb_par *par);
static void wait_for_idle(struct aty128fb_par *par);
static u32 depth_to_dst(u32 depth);
-
-#ifdef CONFIG_FB_ATY128_BACKLIGHT
static void aty128_bl_set_power(struct fb_info *info, int power);
-#endif
#define BIOS_IN8(v) (readb(bios + (v)))
#define BIOS_IN16(v) (readb(bios + (v)) | \
diff --git a/trunk/drivers/video/aty/atyfb_base.c b/trunk/drivers/video/aty/atyfb_base.c
index 053ff63365b7..1507d19f481f 100644
--- a/trunk/drivers/video/aty/atyfb_base.c
+++ b/trunk/drivers/video/aty/atyfb_base.c
@@ -2812,7 +2812,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
if (par->lock_blank || par->asleep)
return 0;
-#ifdef CONFIG_FB_ATY_BACKLIGHT
+#ifdef CONFIG_PMAC_BACKLIGHT
if (machine_is(powermac) && blank > FB_BLANK_NORMAL)
aty_bl_set_power(info, FB_BLANK_POWERDOWN);
#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
@@ -2844,7 +2844,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
}
aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
-#ifdef CONFIG_FB_ATY_BACKLIGHT
+#ifdef CONFIG_PMAC_BACKLIGHT
if (machine_is(powermac) && blank <= FB_BLANK_NORMAL)
aty_bl_set_power(info, FB_BLANK_UNBLANK);
#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
diff --git a/trunk/drivers/video/aty/radeon_base.c b/trunk/drivers/video/aty/radeon_base.c
index 8e3400d5dd21..8d85fc58142e 100644
--- a/trunk/drivers/video/aty/radeon_base.c
+++ b/trunk/drivers/video/aty/radeon_base.c
@@ -266,8 +266,6 @@ static int force_measure_pll = 0;
#ifdef CONFIG_MTRR
static int nomtrr = 0;
#endif
-static int force_sleep;
-static int ignore_devlist;
/*
* prototypes
@@ -2329,9 +2327,9 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
/* -2 is special: means ON on mobility chips and do not
* change on others
*/
- radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1, ignore_devlist, force_sleep);
+ radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1);
} else
- radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep);
+ radeonfb_pm_init(rinfo, default_dynclk);
pci_set_drvdata(pdev, info);
@@ -2479,12 +2477,6 @@ static int __init radeonfb_setup (char *options)
force_measure_pll = 1;
} else if (!strncmp(this_opt, "ignore_edid", 11)) {
ignore_edid = 1;
-#if defined(CONFIG_PM) && defined(CONFIG_X86)
- } else if (!strncmp(this_opt, "force_sleep", 11)) {
- force_sleep = 1;
- } else if (!strncmp(this_opt, "ignore_devlist", 14)) {
- ignore_devlist = 1;
-#endif
} else
mode_option = this_opt;
}
@@ -2540,9 +2532,3 @@ module_param(panel_yres, int, 0);
MODULE_PARM_DESC(panel_yres, "int: set panel yres");
module_param(mode_option, charp, 0);
MODULE_PARM_DESC(mode_option, "Specify resolution as \"x[-][@]\" ");
-#if defined(CONFIG_PM) && defined(CONFIG_X86)
-module_param(force_sleep, bool, 0);
-MODULE_PARM_DESC(force_sleep, "bool: force D2 sleep mode on all hardware");
-module_param(ignore_devlist, bool, 0);
-MODULE_PARM_DESC(ignore_devlist, "bool: ignore workarounds for bugs in specific laptops");
-#endif
diff --git a/trunk/drivers/video/aty/radeon_pm.c b/trunk/drivers/video/aty/radeon_pm.c
index f31e606a2ded..c7091761cef4 100644
--- a/trunk/drivers/video/aty/radeon_pm.c
+++ b/trunk/drivers/video/aty/radeon_pm.c
@@ -27,99 +27,6 @@
#include "ati_ids.h"
-static void radeon_reinitialize_M10(struct radeonfb_info *rinfo);
-
-/*
- * Workarounds for bugs in PC laptops:
- * - enable D2 sleep in some IBM Thinkpads
- * - special case for Samsung P35
- *
- * Whitelist by subsystem vendor/device because
- * its the subsystem vendor's fault!
- */
-
-#if defined(CONFIG_PM) && defined(CONFIG_X86)
-struct radeon_device_id {
- const char *ident; /* (arbitrary) Name */
- const unsigned short subsystem_vendor; /* Subsystem Vendor ID */
- const unsigned short subsystem_device; /* Subsystem Device ID */
- const enum radeon_pm_mode pm_mode_modifier; /* modify pm_mode */
- const reinit_function_ptr new_reinit_func; /* changed reinit_func */
-};
-
-#define BUGFIX(model, sv, sd, pm, fn) { \
- .ident = model, \
- .subsystem_vendor = sv, \
- .subsystem_device = sd, \
- .pm_mode_modifier = pm, \
- .new_reinit_func = fn \
-}
-
-static struct radeon_device_id radeon_workaround_list[] = {
- BUGFIX("IBM Thinkpad R32",
- PCI_VENDOR_ID_IBM, 0x1905,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad R40",
- PCI_VENDOR_ID_IBM, 0x0526,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad R40",
- PCI_VENDOR_ID_IBM, 0x0527,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad R50/R51/T40/T41",
- PCI_VENDOR_ID_IBM, 0x0531,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad R51/T40/T41/T42",
- PCI_VENDOR_ID_IBM, 0x0530,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad T30",
- PCI_VENDOR_ID_IBM, 0x0517,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad T40p",
- PCI_VENDOR_ID_IBM, 0x054d,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad T42",
- PCI_VENDOR_ID_IBM, 0x0550,
- radeon_pm_d2, NULL),
- BUGFIX("IBM Thinkpad X31/X32",
- PCI_VENDOR_ID_IBM, 0x052f,
- radeon_pm_d2, NULL),
- BUGFIX("Samsung P35",
- PCI_VENDOR_ID_SAMSUNG, 0xc00c,
- radeon_pm_off, radeon_reinitialize_M10),
- { .ident = NULL }
-};
-
-static int radeon_apply_workarounds(struct radeonfb_info *rinfo)
-{
- struct radeon_device_id *id;
-
- for (id = radeon_workaround_list; id->ident != NULL; id++ )
- if ((id->subsystem_vendor == rinfo->pdev->subsystem_vendor ) &&
- (id->subsystem_device == rinfo->pdev->subsystem_device )) {
-
- /* we found a device that requires workaround */
- printk(KERN_DEBUG "radeonfb: %s detected"
- ", enabling workaround\n", id->ident);
-
- rinfo->pm_mode |= id->pm_mode_modifier;
-
- if (id->new_reinit_func != NULL)
- rinfo->reinit_func = id->new_reinit_func;
-
- return 1;
- }
- return 0; /* not found */
-}
-
-#else /* defined(CONFIG_PM) && defined(CONFIG_X86) */
-static inline int radeon_apply_workarounds(struct radeonfb_info *rinfo)
-{
- return 0;
-}
-#endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */
-
-
-
static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo)
{
u32 tmp;
@@ -945,26 +852,18 @@ static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo)
/* because both INPLL and OUTPLL take the same lock, that's why. */
tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND;
OUTPLL( pllMCLK_MISC, tmp);
+
+ /* AGP PLL control */
+ if (rinfo->family <= CHIP_FAMILY_RV280) {
+ OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID);
- /* BUS_CNTL1__MOBILE_PLATORM_SEL setting is northbridge chipset
- * and radeon chip dependent. Thus we only enable it on Mac for
- * now (until we get more info on how to compute the correct
- * value for various X86 bridges).
- */
-#ifdef CONFIG_PPC_PMAC
- if (machine_is(powermac)) {
- /* AGP PLL control */
- if (rinfo->family <= CHIP_FAMILY_RV280) {
- OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) | BUS_CNTL1__AGPCLK_VALID);
- OUTREG(BUS_CNTL1,
- (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK)
- | (2<pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM);
@@ -2830,13 +2729,22 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis
}
#if defined(CONFIG_PM)
-#if defined(CONFIG_PPC_PMAC)
/* Check if we can power manage on suspend/resume. We can do
* D2 on M6, M7 and M9, and we can resume from D3 cold a few other
* "Mac" cards, but that's all. We need more infos about what the
* BIOS does tho. Right now, all this PM stuff is pmac-only for that
* reason. --BenH
*/
+ /* Special case for Samsung P35 laptops
+ */
+ if ((rinfo->pdev->vendor == PCI_VENDOR_ID_ATI) &&
+ (rinfo->pdev->device == PCI_CHIP_RV350_NP) &&
+ (rinfo->pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG) &&
+ (rinfo->pdev->subsystem_device == 0xc00c)) {
+ rinfo->reinit_func = radeon_reinitialize_M10;
+ rinfo->pm_mode |= radeon_pm_off;
+ }
+#if defined(CONFIG_PPC_PMAC)
if (machine_is(powermac) && rinfo->of_node) {
if (rinfo->is_mobility && rinfo->pm_reg &&
rinfo->family <= CHIP_FAMILY_RV250)
@@ -2882,18 +2790,6 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis
}
#endif /* defined(CONFIG_PPC_PMAC) */
#endif /* defined(CONFIG_PM) */
-
- if (ignore_devlist)
- printk(KERN_DEBUG
- "radeonfb: skipping test for device workarounds\n");
- else
- radeon_apply_workarounds(rinfo);
-
- if (force_sleep) {
- printk(KERN_DEBUG
- "radeonfb: forcefully enabling D2 sleep mode\n");
- rinfo->pm_mode |= radeon_pm_d2;
- }
}
void radeonfb_pm_exit(struct radeonfb_info *rinfo)
diff --git a/trunk/drivers/video/aty/radeonfb.h b/trunk/drivers/video/aty/radeonfb.h
index d5ff224a6258..38657b2d10eb 100644
--- a/trunk/drivers/video/aty/radeonfb.h
+++ b/trunk/drivers/video/aty/radeonfb.h
@@ -273,8 +273,6 @@ enum radeon_pm_mode {
radeon_pm_off = 0x00000002, /* Can resume from D3 cold */
};
-typedef void (*reinit_function_ptr)(struct radeonfb_info *rinfo);
-
struct radeonfb_info {
struct fb_info *info;
@@ -340,7 +338,7 @@ struct radeonfb_info {
int dynclk;
int no_schedule;
enum radeon_pm_mode pm_mode;
- reinit_function_ptr reinit_func;
+ void (*reinit_func)(struct radeonfb_info *rinfo);
/* Lock on register access */
spinlock_t reg_lock;
@@ -602,7 +600,7 @@ extern int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, u8
/* PM Functions */
extern int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state);
extern int radeonfb_pci_resume(struct pci_dev *pdev);
-extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep);
+extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk);
extern void radeonfb_pm_exit(struct radeonfb_info *rinfo);
/* Monitor probe functions */
diff --git a/trunk/drivers/video/backlight/Kconfig b/trunk/drivers/video/backlight/Kconfig
index 02f15297a021..022f9d3473f5 100644
--- a/trunk/drivers/video/backlight/Kconfig
+++ b/trunk/drivers/video/backlight/Kconfig
@@ -10,7 +10,7 @@ menuconfig BACKLIGHT_LCD_SUPPORT
config BACKLIGHT_CLASS_DEVICE
tristate "Lowlevel Backlight controls"
- depends on BACKLIGHT_LCD_SUPPORT
+ depends on BACKLIGHT_LCD_SUPPORT && FB
default m
help
This framework adds support for low-level control of the LCD
@@ -26,7 +26,7 @@ config BACKLIGHT_DEVICE
config LCD_CLASS_DEVICE
tristate "Lowlevel LCD controls"
- depends on BACKLIGHT_LCD_SUPPORT
+ depends on BACKLIGHT_LCD_SUPPORT && FB
default m
help
This framework adds support for low-level control of LCD.
diff --git a/trunk/drivers/video/console/mdacon.c b/trunk/drivers/video/console/mdacon.c
index eb4d03fa5391..52ed12b12acc 100644
--- a/trunk/drivers/video/console/mdacon.c
+++ b/trunk/drivers/video/console/mdacon.c
@@ -197,7 +197,7 @@ static int __init mdacon_setup(char *str)
__setup("mdacon=", mdacon_setup);
#endif
-static int mda_detect(void)
+static int __init mda_detect(void)
{
int count=0;
u16 *p, p_save;
@@ -282,7 +282,7 @@ static int mda_detect(void)
return 1;
}
-static void mda_initialize(void)
+static void __init mda_initialize(void)
{
write_mda_b(97, 0x00); /* horizontal total */
write_mda_b(80, 0x01); /* horizontal displayed */
diff --git a/trunk/drivers/video/fb_notify.c b/trunk/drivers/video/fb_notify.c
deleted file mode 100644
index 8c020389e4fa..000000000000
--- a/trunk/drivers/video/fb_notify.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * linux/drivers/video/fb_notify.c
- *
- * Copyright (C) 2006 Antonino Daplas
- *
- * 2001 - Documented with DocBook
- * - Brad Douglas
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file COPYING in the main directory of this archive
- * for more details.
- */
-#include
-#include
-
-static BLOCKING_NOTIFIER_HEAD(fb_notifier_list);
-
-/**
- * fb_register_client - register a client notifier
- * @nb: notifier block to callback on events
- */
-int fb_register_client(struct notifier_block *nb)
-{
- return blocking_notifier_chain_register(&fb_notifier_list, nb);
-}
-EXPORT_SYMBOL(fb_register_client);
-
-/**
- * fb_unregister_client - unregister a client notifier
- * @nb: notifier block to callback on events
- */
-int fb_unregister_client(struct notifier_block *nb)
-{
- return blocking_notifier_chain_unregister(&fb_notifier_list, nb);
-}
-EXPORT_SYMBOL(fb_unregister_client);
-
-/**
- * fb_notifier_call_chain - notify clients of fb_events
- *
- */
-int fb_notifier_call_chain(unsigned long val, void *v)
-{
- return blocking_notifier_call_chain(&fb_notifier_list, val, v);
-}
-EXPORT_SYMBOL_GPL(fb_notifier_call_chain);
diff --git a/trunk/drivers/video/fbmem.c b/trunk/drivers/video/fbmem.c
index 17961e3ecaa0..4fc9df426c1a 100644
--- a/trunk/drivers/video/fbmem.c
+++ b/trunk/drivers/video/fbmem.c
@@ -52,6 +52,7 @@
#define FBPIXMAPSIZE (1024 * 8)
+static BLOCKING_NOTIFIER_HEAD(fb_notifier_list);
struct fb_info *registered_fb[FB_MAX];
int num_registered_fb;
@@ -790,7 +791,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
event.info = info;
event.data = &mode1;
- ret = fb_notifier_call_chain(FB_EVENT_MODE_DELETE, &event);
+ ret = blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_MODE_DELETE, &event);
}
if (!ret)
@@ -835,7 +837,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
info->flags &= ~FBINFO_MISC_USEREVENT;
event.info = info;
- fb_notifier_call_chain(evnt, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ evnt, &event);
}
}
}
@@ -858,7 +861,8 @@ fb_blank(struct fb_info *info, int blank)
event.info = info;
event.data = ␣
- fb_notifier_call_chain(FB_EVENT_BLANK, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_BLANK, &event);
}
return ret;
@@ -929,7 +933,8 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
con2fb.framebuffer = -1;
event.info = info;
event.data = &con2fb;
- fb_notifier_call_chain(FB_EVENT_GET_CONSOLE_MAP, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_GET_CONSOLE_MAP, &event);
return copy_to_user(argp, &con2fb,
sizeof(con2fb)) ? -EFAULT : 0;
case FBIOPUT_CON2FBMAP:
@@ -947,8 +952,9 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
return -EINVAL;
event.info = info;
event.data = &con2fb;
- return fb_notifier_call_chain(FB_EVENT_SET_CONSOLE_MAP,
- &event);
+ return blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_SET_CONSOLE_MAP,
+ &event);
case FBIOBLANK:
acquire_console_sem();
info->flags |= FBINFO_MISC_USEREVENT;
@@ -1324,7 +1330,8 @@ register_framebuffer(struct fb_info *fb_info)
registered_fb[i] = fb_info;
event.info = fb_info;
- fb_notifier_call_chain(FB_EVENT_FB_REGISTERED, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_FB_REGISTERED, &event);
return 0;
}
@@ -1358,10 +1365,29 @@ unregister_framebuffer(struct fb_info *fb_info)
fb_cleanup_class_device(fb_info);
class_device_destroy(fb_class, MKDEV(FB_MAJOR, i));
event.info = fb_info;
- fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_FB_UNREGISTERED, &event);
return 0;
}
+/**
+ * fb_register_client - register a client notifier
+ * @nb: notifier block to callback on events
+ */
+int fb_register_client(struct notifier_block *nb)
+{
+ return blocking_notifier_chain_register(&fb_notifier_list, nb);
+}
+
+/**
+ * fb_unregister_client - unregister a client notifier
+ * @nb: notifier block to callback on events
+ */
+int fb_unregister_client(struct notifier_block *nb)
+{
+ return blocking_notifier_chain_unregister(&fb_notifier_list, nb);
+}
+
/**
* fb_set_suspend - low level driver signals suspend
* @info: framebuffer affected
@@ -1377,11 +1403,13 @@ void fb_set_suspend(struct fb_info *info, int state)
event.info = info;
if (state) {
- fb_notifier_call_chain(FB_EVENT_SUSPEND, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_SUSPEND, &event);
info->state = FBINFO_STATE_SUSPENDED;
} else {
info->state = FBINFO_STATE_RUNNING;
- fb_notifier_call_chain(FB_EVENT_RESUME, &event);
+ blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_RESUME, &event);
}
}
@@ -1452,7 +1480,9 @@ int fb_new_modelist(struct fb_info *info)
if (!list_empty(&info->modelist)) {
event.info = info;
- err = fb_notifier_call_chain(FB_EVENT_NEW_MODELIST, &event);
+ err = blocking_notifier_call_chain(&fb_notifier_list,
+ FB_EVENT_NEW_MODELIST,
+ &event);
}
return err;
@@ -1564,6 +1594,8 @@ EXPORT_SYMBOL(fb_blank);
EXPORT_SYMBOL(fb_pan_display);
EXPORT_SYMBOL(fb_get_buffer_offset);
EXPORT_SYMBOL(fb_set_suspend);
+EXPORT_SYMBOL(fb_register_client);
+EXPORT_SYMBOL(fb_unregister_client);
EXPORT_SYMBOL(fb_get_options);
MODULE_LICENSE("GPL");
diff --git a/trunk/drivers/video/nvidia/nvidia.c b/trunk/drivers/video/nvidia/nvidia.c
index d4f850117874..9f2066f0745a 100644
--- a/trunk/drivers/video/nvidia/nvidia.c
+++ b/trunk/drivers/video/nvidia/nvidia.c
@@ -34,6 +34,10 @@
#include "nv_proto.h"
#include "nv_dma.h"
+#ifndef CONFIG_PCI /* sanity check */
+#error This driver requires PCI support.
+#endif
+
#undef CONFIG_FB_NVIDIA_DEBUG
#ifdef CONFIG_FB_NVIDIA_DEBUG
#define NVTRACE printk
@@ -1299,19 +1303,20 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
nvidia_save_vga(par, &par->SavedReg);
- pci_set_drvdata(pd, info);
- nvidia_bl_init(par);
if (register_framebuffer(info) < 0) {
printk(KERN_ERR PFX "error registering nVidia framebuffer\n");
goto err_out_iounmap_fb;
}
+ pci_set_drvdata(pd, info);
printk(KERN_INFO PFX
"PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n",
info->fix.id,
par->FbMapSize / (1024 * 1024), info->fix.smem_start);
+ nvidia_bl_init(par);
+
NVTRACE_LEAVE();
return 0;
diff --git a/trunk/drivers/video/offb.c b/trunk/drivers/video/offb.c
index 0013311e0564..ce5f3031b99b 100644
--- a/trunk/drivers/video/offb.c
+++ b/trunk/drivers/video/offb.c
@@ -62,6 +62,8 @@ struct offb_par default_par;
* Interface used by the world
*/
+int offb_init(void);
+
static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
u_int transp, struct fb_info *info);
static int offb_blank(int blank, struct fb_info *info);
@@ -70,6 +72,11 @@ static int offb_blank(int blank, struct fb_info *info);
extern boot_infos_t *boot_infos;
#endif
+static void offb_init_nodriver(struct device_node *);
+static void offb_init_fb(const char *name, const char *full_name,
+ int width, int height, int depth, int pitch,
+ unsigned long address, struct device_node *dp);
+
static struct fb_ops offb_ops = {
.owner = THIS_MODULE,
.fb_setcolreg = offb_setcolreg,
@@ -222,17 +229,123 @@ static int offb_blank(int blank, struct fb_info *info)
return 0;
}
+ /*
+ * Initialisation
+ */
-static void __iomem *offb_map_reg(struct device_node *np, int index,
- unsigned long offset, unsigned long size)
+int __init offb_init(void)
{
- struct resource r;
+ struct device_node *dp = NULL, *boot_disp = NULL;
- if (of_address_to_resource(np, index, &r))
- return 0;
- if ((r.start + offset + size) > r.end)
- return 0;
- return ioremap(r.start + offset, size);
+ if (fb_get_options("offb", NULL))
+ return -ENODEV;
+
+ for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) {
+ if (get_property(dp, "linux,opened", NULL) &&
+ get_property(dp, "linux,boot-display", NULL)) {
+ boot_disp = dp;
+ offb_init_nodriver(dp);
+ }
+ }
+ for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) {
+ if (get_property(dp, "linux,opened", NULL) &&
+ dp != boot_disp)
+ offb_init_nodriver(dp);
+ }
+
+ return 0;
+}
+
+
+static void __init offb_init_nodriver(struct device_node *dp)
+{
+ unsigned int len;
+ int i, width = 640, height = 480, depth = 8, pitch = 640;
+ unsigned int flags, rsize, addr_prop = 0;
+ unsigned long max_size = 0;
+ u64 rstart, address = OF_BAD_ADDR;
+ u32 *pp, *addrp, *up;
+ u64 asize;
+
+ pp = (u32 *)get_property(dp, "linux,bootx-depth", &len);
+ if (pp == NULL)
+ pp = (u32 *)get_property(dp, "depth", &len);
+ if (pp && len == sizeof(u32))
+ depth = *pp;
+
+ pp = (u32 *)get_property(dp, "linux,bootx-width", &len);
+ if (pp == NULL)
+ pp = (u32 *)get_property(dp, "width", &len);
+ if (pp && len == sizeof(u32))
+ width = *pp;
+
+ pp = (u32 *)get_property(dp, "linux,bootx-height", &len);
+ if (pp == NULL)
+ pp = (u32 *)get_property(dp, "height", &len);
+ if (pp && len == sizeof(u32))
+ height = *pp;
+
+ pp = (u32 *)get_property(dp, "linux,bootx-linebytes", &len);
+ if (pp == NULL)
+ pp = (u32 *)get_property(dp, "linebytes", &len);
+ if (pp && len == sizeof(u32))
+ pitch = *pp;
+ else
+ pitch = width * ((depth + 7) / 8);
+
+ rsize = (unsigned long)pitch * (unsigned long)height;
+
+ /* Ok, now we try to figure out the address of the framebuffer.
+ *
+ * Unfortunately, Open Firmware doesn't provide a standard way to do
+ * so. All we can do is a dodgy heuristic that happens to work in
+ * practice. On most machines, the "address" property contains what
+ * we need, though not on Matrox cards found in IBM machines. What I've
+ * found that appears to give good results is to go through the PCI
+ * ranges and pick one that is both big enough and if possible encloses
+ * the "address" property. If none match, we pick the biggest
+ */
+ up = (u32 *)get_property(dp, "linux,bootx-addr", &len);
+ if (up == NULL)
+ up = (u32 *)get_property(dp, "address", &len);
+ if (up && len == sizeof(u32))
+ addr_prop = *up;
+
+ for (i = 0; (addrp = of_get_address(dp, i, &asize, &flags))
+ != NULL; i++) {
+ int match_addrp = 0;
+
+ if (!(flags & IORESOURCE_MEM))
+ continue;
+ if (asize < rsize)
+ continue;
+ rstart = of_translate_address(dp, addrp);
+ if (rstart == OF_BAD_ADDR)
+ continue;
+ if (addr_prop && (rstart <= addr_prop) &&
+ ((rstart + asize) >= (addr_prop + rsize)))
+ match_addrp = 1;
+ if (match_addrp) {
+ address = addr_prop;
+ break;
+ }
+ if (rsize > max_size) {
+ max_size = rsize;
+ address = OF_BAD_ADDR;
+ }
+
+ if (address == OF_BAD_ADDR)
+ address = rstart;
+ }
+ if (address == OF_BAD_ADDR && addr_prop)
+ address = (u64)addr_prop;
+ if (address != OF_BAD_ADDR) {
+ /* kludge for valkyrie */
+ if (strcmp(dp->name, "valkyrie") == 0)
+ address += 0x1000;
+ offb_init_fb(dp->name, dp->full_name, width, height, depth,
+ pitch, address, dp);
+ }
}
static void __init offb_init_fb(const char *name, const char *full_name,
@@ -289,39 +402,45 @@ static void __init offb_init_fb(const char *name, const char *full_name,
par->cmap_type = cmap_unknown;
if (depth == 8) {
+
/* Palette hacks disabled for now */
+#if 0
if (dp && !strncmp(name, "ATY,Rage128", 11)) {
- par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
- if (par->cmap_adr)
- par->cmap_type = cmap_r128;
+ unsigned long regbase = dp->addrs[2].address;
+ par->cmap_adr = ioremap(regbase, 0x1FFF);
+ par->cmap_type = cmap_r128;
} else if (dp && (!strncmp(name, "ATY,RageM3pA", 12)
|| !strncmp(name, "ATY,RageM3p12A", 14))) {
- par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
- if (par->cmap_adr)
- par->cmap_type = cmap_M3A;
+ unsigned long regbase =
+ dp->parent->addrs[2].address;
+ par->cmap_adr = ioremap(regbase, 0x1FFF);
+ par->cmap_type = cmap_M3A;
} else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) {
- par->cmap_adr = offb_map_reg(dp, 2, 0, 0x1fff);
- if (par->cmap_adr)
- par->cmap_type = cmap_M3B;
+ unsigned long regbase =
+ dp->parent->addrs[2].address;
+ par->cmap_adr = ioremap(regbase, 0x1FFF);
+ par->cmap_type = cmap_M3B;
} else if (dp && !strncmp(name, "ATY,Rage6", 9)) {
- par->cmap_adr = offb_map_reg(dp, 1, 0, 0x1fff);
- if (par->cmap_adr)
- par->cmap_type = cmap_radeon;
+ unsigned long regbase = dp->addrs[1].address;
+ par->cmap_adr = ioremap(regbase, 0x1FFF);
+ par->cmap_type = cmap_radeon;
} else if (!strncmp(name, "ATY,", 4)) {
unsigned long base = address & 0xff000000UL;
par->cmap_adr =
ioremap(base + 0x7ff000, 0x1000) + 0xcc0;
par->cmap_data = par->cmap_adr + 1;
par->cmap_type = cmap_m64;
- } else if (dp && device_is_compatible(dp, "pci1014,b7")) {
- par->cmap_adr = offb_map_reg(dp, 0, 0x6000, 0x1000);
- if (par->cmap_adr)
- par->cmap_type = cmap_gxt2000;
+ } else if (device_is_compatible(dp, "pci1014,b7")) {
+ unsigned long regbase = dp->addrs[0].address;
+ par->cmap_adr = ioremap(regbase + 0x6000, 0x1000);
+ par->cmap_type = cmap_gxt2000;
}
- fix->visual = (par->cmap_type != cmap_unknown) ?
- FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_STATIC_PSEUDOCOLOR;
+#endif
+ fix->visual = par->cmap_adr ? FB_VISUAL_PSEUDOCOLOR
+ : FB_VISUAL_STATIC_PSEUDOCOLOR;
} else
- fix->visual = FB_VISUAL_TRUECOLOR;
+ fix->visual = /* par->cmap_adr ? FB_VISUAL_DIRECTCOLOR
+ : */ FB_VISUAL_TRUECOLOR;
var->xoffset = var->yoffset = 0;
switch (depth) {
@@ -401,139 +520,5 @@ static void __init offb_init_fb(const char *name, const char *full_name,
info->node, full_name);
}
-
-static void __init offb_init_nodriver(struct device_node *dp, int no_real_node)
-{
- unsigned int len;
- int i, width = 640, height = 480, depth = 8, pitch = 640;
- unsigned int flags, rsize, addr_prop = 0;
- unsigned long max_size = 0;
- u64 rstart, address = OF_BAD_ADDR;
- u32 *pp, *addrp, *up;
- u64 asize;
-
- pp = (u32 *)get_property(dp, "linux,bootx-depth", &len);
- if (pp == NULL)
- pp = (u32 *)get_property(dp, "depth", &len);
- if (pp && len == sizeof(u32))
- depth = *pp;
-
- pp = (u32 *)get_property(dp, "linux,bootx-width", &len);
- if (pp == NULL)
- pp = (u32 *)get_property(dp, "width", &len);
- if (pp && len == sizeof(u32))
- width = *pp;
-
- pp = (u32 *)get_property(dp, "linux,bootx-height", &len);
- if (pp == NULL)
- pp = (u32 *)get_property(dp, "height", &len);
- if (pp && len == sizeof(u32))
- height = *pp;
-
- pp = (u32 *)get_property(dp, "linux,bootx-linebytes", &len);
- if (pp == NULL)
- pp = (u32 *)get_property(dp, "linebytes", &len);
- if (pp && len == sizeof(u32))
- pitch = *pp;
- else
- pitch = width * ((depth + 7) / 8);
-
- rsize = (unsigned long)pitch * (unsigned long)height;
-
- /* Ok, now we try to figure out the address of the framebuffer.
- *
- * Unfortunately, Open Firmware doesn't provide a standard way to do
- * so. All we can do is a dodgy heuristic that happens to work in
- * practice. On most machines, the "address" property contains what
- * we need, though not on Matrox cards found in IBM machines. What I've
- * found that appears to give good results is to go through the PCI
- * ranges and pick one that is both big enough and if possible encloses
- * the "address" property. If none match, we pick the biggest
- */
- up = (u32 *)get_property(dp, "linux,bootx-addr", &len);
- if (up == NULL)
- up = (u32 *)get_property(dp, "address", &len);
- if (up && len == sizeof(u32))
- addr_prop = *up;
-
- /* Hack for when BootX is passing us */
- if (no_real_node)
- goto skip_addr;
-
- for (i = 0; (addrp = of_get_address(dp, i, &asize, &flags))
- != NULL; i++) {
- int match_addrp = 0;
-
- if (!(flags & IORESOURCE_MEM))
- continue;
- if (asize < rsize)
- continue;
- rstart = of_translate_address(dp, addrp);
- if (rstart == OF_BAD_ADDR)
- continue;
- if (addr_prop && (rstart <= addr_prop) &&
- ((rstart + asize) >= (addr_prop + rsize)))
- match_addrp = 1;
- if (match_addrp) {
- address = addr_prop;
- break;
- }
- if (rsize > max_size) {
- max_size = rsize;
- address = OF_BAD_ADDR;
- }
-
- if (address == OF_BAD_ADDR)
- address = rstart;
- }
- skip_addr:
- if (address == OF_BAD_ADDR && addr_prop)
- address = (u64)addr_prop;
- if (address != OF_BAD_ADDR) {
- /* kludge for valkyrie */
- if (strcmp(dp->name, "valkyrie") == 0)
- address += 0x1000;
- offb_init_fb(no_real_node ? "bootx" : dp->name,
- no_real_node ? "display" : dp->full_name,
- width, height, depth, pitch, address,
- no_real_node ? dp : NULL);
- }
-}
-
-static int __init offb_init(void)
-{
- struct device_node *dp = NULL, *boot_disp = NULL;
-
- if (fb_get_options("offb", NULL))
- return -ENODEV;
-
- /* Check if we have a MacOS display without a node spec */
- if (get_property(of_chosen, "linux,bootx-noscreen", NULL) != NULL) {
- /* The old code tried to work out which node was the MacOS
- * display based on the address. I'm dropping that since the
- * lack of a node spec only happens with old BootX versions
- * (users can update) and with this code, they'll still get
- * a display (just not the palette hacks).
- */
- offb_init_nodriver(of_chosen, 1);
- }
-
- for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) {
- if (get_property(dp, "linux,opened", NULL) &&
- get_property(dp, "linux,boot-display", NULL)) {
- boot_disp = dp;
- offb_init_nodriver(dp, 0);
- }
- }
- for (dp = NULL; (dp = of_find_node_by_type(dp, "display"));) {
- if (get_property(dp, "linux,opened", NULL) &&
- dp != boot_disp)
- offb_init_nodriver(dp, 0);
- }
-
- return 0;
-}
-
-
module_init(offb_init);
MODULE_LICENSE("GPL");
diff --git a/trunk/drivers/video/riva/fbdev.c b/trunk/drivers/video/riva/fbdev.c
index 76fc9d355eb7..33dddbae5420 100644
--- a/trunk/drivers/video/riva/fbdev.c
+++ b/trunk/drivers/video/riva/fbdev.c
@@ -2132,9 +2132,6 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
fb_destroy_modedb(info->monspecs.modedb);
info->monspecs.modedb = NULL;
-
- pci_set_drvdata(pd, info);
- riva_bl_init(info->par);
ret = register_framebuffer(info);
if (ret < 0) {
printk(KERN_ERR PFX
@@ -2142,6 +2139,8 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
goto err_iounmap_screen_base;
}
+ pci_set_drvdata(pd, info);
+
printk(KERN_INFO PFX
"PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n",
info->fix.id,
@@ -2149,6 +2148,8 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
info->fix.smem_len / (1024 * 1024),
info->fix.smem_start);
+ riva_bl_init(info->par);
+
NVTRACE_LEAVE();
return 0;
diff --git a/trunk/fs/9p/conv.c b/trunk/fs/9p/conv.c
index 56d88c1a09c5..1e898144eb7c 100644
--- a/trunk/fs/9p/conv.c
+++ b/trunk/fs/9p/conv.c
@@ -673,10 +673,8 @@ struct v9fs_fcall *v9fs_create_tcreate(u32 fid, char *name, u32 perm, u8 mode,
struct cbuf *bufp = &buffer;
size = 4 + 2 + strlen(name) + 4 + 1; /* fid[4] name[s] perm[4] mode[1] */
- if (extended) {
- size += 2 + /* extension[s] */
- (extension == NULL ? 0 : strlen(extension));
- }
+ if (extended && extension!=NULL)
+ size += 2 + strlen(extension); /* extension[s] */
fc = v9fs_create_common(bufp, size, TCREATE);
if (IS_ERR(fc))
diff --git a/trunk/fs/9p/vfs_inode.c b/trunk/fs/9p/vfs_inode.c
index eae50c9d6dc4..2f580a197b8d 100644
--- a/trunk/fs/9p/vfs_inode.c
+++ b/trunk/fs/9p/vfs_inode.c
@@ -434,11 +434,11 @@ static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir)
result = v9fs_t_remove(v9ses, fid, &fcall);
if (result < 0) {
PRINT_FCALL_ERROR("remove fails", fcall);
+ } else {
+ v9fs_put_idpool(fid, &v9ses->fidpool);
+ v9fs_fid_destroy(v9fid);
}
- v9fs_put_idpool(fid, &v9ses->fidpool);
- v9fs_fid_destroy(v9fid);
-
kfree(fcall);
return result;
}
diff --git a/trunk/fs/buffer.c b/trunk/fs/buffer.c
index 71649ef9b658..3660dcb97591 100644
--- a/trunk/fs/buffer.c
+++ b/trunk/fs/buffer.c
@@ -470,18 +470,13 @@ __find_get_block_slow(struct block_device *bdev, sector_t block)
pass does the actual I/O. */
void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers)
{
- struct address_space *mapping = bdev->bd_inode->i_mapping;
-
- if (mapping->nrpages == 0)
- return;
-
invalidate_bh_lrus();
/*
* FIXME: what about destroy_dirty_buffers?
* We really want to use invalidate_inode_pages2() for
* that, but not until that's cleaned up.
*/
- invalidate_inode_pages(mapping);
+ invalidate_inode_pages(bdev->bd_inode->i_mapping);
}
/*
diff --git a/trunk/fs/coda/file.c b/trunk/fs/coda/file.c
index dbfbcfa5b3c0..cc66c681bd11 100644
--- a/trunk/fs/coda/file.c
+++ b/trunk/fs/coda/file.c
@@ -136,8 +136,10 @@ int coda_open(struct inode *coda_inode, struct file *coda_file)
coda_vfs_stat.open++;
cfi = kmalloc(sizeof(struct coda_file_info), GFP_KERNEL);
- if (!cfi)
+ if (!cfi) {
+ unlock_kernel();
return -ENOMEM;
+ }
lock_kernel();
diff --git a/trunk/fs/efs/symlink.c b/trunk/fs/efs/symlink.c
index 1d30d2ff440f..e249cf733a6b 100644
--- a/trunk/fs/efs/symlink.c
+++ b/trunk/fs/efs/symlink.c
@@ -22,7 +22,7 @@ static int efs_symlink_readpage(struct file *file, struct page *page)
err = -ENAMETOOLONG;
if (size > 2 * EFS_BLOCKSIZE)
- goto fail_notlocked;
+ goto fail;
lock_kernel();
/* read first 512 bytes of link target */
@@ -47,7 +47,6 @@ static int efs_symlink_readpage(struct file *file, struct page *page)
return 0;
fail:
unlock_kernel();
-fail_notlocked:
SetPageError(page);
kunmap(page);
unlock_page(page);
diff --git a/trunk/fs/ext3/inode.c b/trunk/fs/ext3/inode.c
index c5ee9f0691e3..f804d5e9d60c 100644
--- a/trunk/fs/ext3/inode.c
+++ b/trunk/fs/ext3/inode.c
@@ -1158,7 +1158,7 @@ static int ext3_prepare_write(struct file *file, struct page *page,
ret = PTR_ERR(handle);
goto out;
}
- if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
+ if (test_opt(inode->i_sb, NOBH))
ret = nobh_prepare_write(page, from, to, ext3_get_block);
else
ret = block_prepare_write(page, from, to, ext3_get_block);
@@ -1244,7 +1244,7 @@ static int ext3_writeback_commit_write(struct file *file, struct page *page,
if (new_i_size > EXT3_I(inode)->i_disksize)
EXT3_I(inode)->i_disksize = new_i_size;
- if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
+ if (test_opt(inode->i_sb, NOBH))
ret = nobh_commit_write(file, page, from, to);
else
ret = generic_commit_write(file, page, from, to);
@@ -1494,7 +1494,7 @@ static int ext3_writeback_writepage(struct page *page,
goto out_fail;
}
- if (test_opt(inode->i_sb, NOBH) && ext3_should_writeback_data(inode))
+ if (test_opt(inode->i_sb, NOBH))
ret = nobh_writepage(page, ext3_get_block, wbc);
else
ret = block_write_full_page(page, ext3_get_block, wbc);
@@ -2402,15 +2402,14 @@ static ext3_fsblk_t ext3_get_inode_block(struct super_block *sb,
struct buffer_head *bh;
struct ext3_group_desc * gdp;
- if (!ext3_valid_inum(sb, ino)) {
- /*
- * This error is already checked for in namei.c unless we are
- * looking at an NFS filehandle, in which case no error
- * report is needed
- */
+
+ if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO &&
+ ino != EXT3_RESIZE_INO && ino < EXT3_FIRST_INO(sb)) ||
+ ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) {
+ ext3_error(sb, "ext3_get_inode_block",
+ "bad inode number: %lu", ino);
return 0;
}
-
block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);
if (block_group >= EXT3_SB(sb)->s_groups_count) {
ext3_error(sb,"ext3_get_inode_block","group >= groups count");
diff --git a/trunk/fs/ext3/namei.c b/trunk/fs/ext3/namei.c
index 2aa7101b27cd..d9176dba3698 100644
--- a/trunk/fs/ext3/namei.c
+++ b/trunk/fs/ext3/namei.c
@@ -1000,12 +1000,7 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
if (bh) {
unsigned long ino = le32_to_cpu(de->inode);
brelse (bh);
- if (!ext3_valid_inum(dir->i_sb, ino)) {
- ext3_error(dir->i_sb, "ext3_lookup",
- "bad inode number: %lu", ino);
- inode = NULL;
- } else
- inode = iget(dir->i_sb, ino);
+ inode = iget(dir->i_sb, ino);
if (!inode)
return ERR_PTR(-EACCES);
@@ -1033,13 +1028,7 @@ struct dentry *ext3_get_parent(struct dentry *child)
return ERR_PTR(-ENOENT);
ino = le32_to_cpu(de->inode);
brelse(bh);
-
- if (!ext3_valid_inum(child->d_inode->i_sb, ino)) {
- ext3_error(child->d_inode->i_sb, "ext3_get_parent",
- "bad inode number: %lu", ino);
- inode = NULL;
- } else
- inode = iget(child->d_inode->i_sb, ino);
+ inode = iget(child->d_inode->i_sb, ino);
if (!inode)
return ERR_PTR(-EACCES);
diff --git a/trunk/fs/freevxfs/vxfs_lookup.c b/trunk/fs/freevxfs/vxfs_lookup.c
index 43886fa00a2a..29cce456c7ce 100644
--- a/trunk/fs/freevxfs/vxfs_lookup.c
+++ b/trunk/fs/freevxfs/vxfs_lookup.c
@@ -246,8 +246,6 @@ vxfs_readdir(struct file *fp, void *retp, filldir_t filler)
u_long page, npages, block, pblocks, nblocks, offset;
loff_t pos;
- lock_kernel();
-
switch ((long)fp->f_pos) {
case 0:
if (filler(retp, ".", 1, fp->f_pos, ip->i_ino, DT_DIR) < 0)
diff --git a/trunk/fs/fuse/control.c b/trunk/fs/fuse/control.c
index 46fe60b2da23..a3bce3a77253 100644
--- a/trunk/fs/fuse/control.c
+++ b/trunk/fs/fuse/control.c
@@ -105,7 +105,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
/*
* Add a connection to the control filesystem (if it exists). Caller
- * must hold fuse_mutex
+ * must host fuse_mutex
*/
int fuse_ctl_add_conn(struct fuse_conn *fc)
{
@@ -139,7 +139,7 @@ int fuse_ctl_add_conn(struct fuse_conn *fc)
/*
* Remove a connection from the control filesystem (if it exists).
- * Caller must hold fuse_mutex
+ * Caller must host fuse_mutex
*/
void fuse_ctl_remove_conn(struct fuse_conn *fc)
{
diff --git a/trunk/fs/fuse/dir.c b/trunk/fs/fuse/dir.c
index 409ce6a7cca4..72a74cde6de8 100644
--- a/trunk/fs/fuse/dir.c
+++ b/trunk/fs/fuse/dir.c
@@ -14,33 +14,6 @@
#include
#include
-#if BITS_PER_LONG >= 64
-static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
-{
- entry->d_time = time;
-}
-
-static inline u64 fuse_dentry_time(struct dentry *entry)
-{
- return entry->d_time;
-}
-#else
-/*
- * On 32 bit archs store the high 32 bits of time in d_fsdata
- */
-static void fuse_dentry_settime(struct dentry *entry, u64 time)
-{
- entry->d_time = time;
- entry->d_fsdata = (void *) (unsigned long) (time >> 32);
-}
-
-static u64 fuse_dentry_time(struct dentry *entry)
-{
- return (u64) entry->d_time +
- ((u64) (unsigned long) entry->d_fsdata << 32);
-}
-#endif
-
/*
* FUSE caches dentries and attributes with separate timeout. The
* time in jiffies until the dentry/attributes are valid is stored in
@@ -50,13 +23,10 @@ static u64 fuse_dentry_time(struct dentry *entry)
/*
* Calculate the time in jiffies until a dentry/attributes are valid
*/
-static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
+static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec)
{
- if (sec || nsec) {
- struct timespec ts = {sec, nsec};
- return get_jiffies_64() + timespec_to_jiffies(&ts);
- } else
- return 0;
+ struct timespec ts = {sec, nsec};
+ return jiffies + timespec_to_jiffies(&ts);
}
/*
@@ -65,8 +35,7 @@ static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
*/
static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o)
{
- fuse_dentry_settime(entry,
- time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
+ entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec);
if (entry->d_inode)
get_fuse_inode(entry->d_inode)->i_time =
time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
@@ -78,7 +47,7 @@ static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o)
*/
void fuse_invalidate_attr(struct inode *inode)
{
- get_fuse_inode(inode)->i_time = 0;
+ get_fuse_inode(inode)->i_time = jiffies - 1;
}
/*
@@ -91,7 +60,7 @@ void fuse_invalidate_attr(struct inode *inode)
*/
static void fuse_invalidate_entry_cache(struct dentry *entry)
{
- fuse_dentry_settime(entry, 0);
+ entry->d_time = jiffies - 1;
}
/*
@@ -133,7 +102,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
if (inode && is_bad_inode(inode))
return 0;
- else if (fuse_dentry_time(entry) < get_jiffies_64()) {
+ else if (time_after(jiffies, entry->d_time)) {
int err;
struct fuse_entry_out outarg;
struct fuse_conn *fc;
@@ -697,7 +666,7 @@ static int fuse_revalidate(struct dentry *entry)
if (!fuse_allow_task(fc, current))
return -EACCES;
if (get_node_id(inode) != FUSE_ROOT_ID &&
- fi->i_time >= get_jiffies_64())
+ time_before_eq(jiffies, fi->i_time))
return 0;
return fuse_do_getattr(inode);
diff --git a/trunk/fs/fuse/fuse_i.h b/trunk/fs/fuse/fuse_i.h
index 69c7750d55b8..0dbf96621841 100644
--- a/trunk/fs/fuse/fuse_i.h
+++ b/trunk/fs/fuse/fuse_i.h
@@ -59,7 +59,7 @@ struct fuse_inode {
struct fuse_req *forget_req;
/** Time in jiffies until the file attributes are valid */
- u64 i_time;
+ unsigned long i_time;
};
/** FUSE specific file data */
diff --git a/trunk/fs/fuse/inode.c b/trunk/fs/fuse/inode.c
index 7d25092262ae..dcaaabd3b9c4 100644
--- a/trunk/fs/fuse/inode.c
+++ b/trunk/fs/fuse/inode.c
@@ -51,7 +51,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
return NULL;
fi = get_fuse_inode(inode);
- fi->i_time = 0;
+ fi->i_time = jiffies - 1;
fi->nodeid = 0;
fi->nlookup = 0;
fi->forget_req = fuse_request_alloc();
diff --git a/trunk/fs/inotify_user.c b/trunk/fs/inotify_user.c
index 017cb0f134d6..f2386442adee 100644
--- a/trunk/fs/inotify_user.c
+++ b/trunk/fs/inotify_user.c
@@ -187,7 +187,7 @@ static struct inotify_kernel_event * kernel_event(s32 wd, u32 mask, u32 cookie,
{
struct inotify_kernel_event *kevent;
- kevent = kmem_cache_alloc(event_cachep, GFP_NOFS);
+ kevent = kmem_cache_alloc(event_cachep, GFP_KERNEL);
if (unlikely(!kevent))
return NULL;
diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c
index 55a131230f94..e01070d7bf58 100644
--- a/trunk/fs/namei.c
+++ b/trunk/fs/namei.c
@@ -159,7 +159,7 @@ char * getname(const char __user * filename)
#ifdef CONFIG_AUDITSYSCALL
void putname(const char *name)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
audit_putname(name);
else
__putname(name);
@@ -1125,7 +1125,7 @@ static int fastcall do_path_lookup(int dfd, const char *name,
retval = link_path_walk(name, nd);
out:
if (likely(retval == 0)) {
- if (unlikely(!audit_dummy_context() && nd && nd->dentry &&
+ if (unlikely(current->audit_context && nd && nd->dentry &&
nd->dentry->d_inode))
audit_inode(name, nd->dentry->d_inode);
}
@@ -1357,7 +1357,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir)
return -ENOENT;
BUG_ON(victim->d_parent->d_inode != dir);
- audit_inode_child(victim->d_name.name, victim->d_inode, dir);
+ audit_inode_child(victim->d_name.name, victim->d_inode, dir->i_ino);
error = permission(dir,MAY_WRITE | MAY_EXEC, NULL);
if (error)
@@ -1659,7 +1659,6 @@ int open_namei(int dfd, const char *pathname, int flag,
* It already exists.
*/
mutex_unlock(&dir->d_inode->i_mutex);
- audit_inode_update(path.dentry->d_inode);
error = -EEXIST;
if (flag & O_EXCL)
@@ -1670,7 +1669,6 @@ int open_namei(int dfd, const char *pathname, int flag,
if (flag & O_NOFOLLOW)
goto exit_dput;
}
-
error = -ENOENT;
if (!path.dentry->d_inode)
goto exit_dput;
diff --git a/trunk/fs/nfsd/nfsfh.c b/trunk/fs/nfsd/nfsfh.c
index 501d83884530..ecc439d2565f 100644
--- a/trunk/fs/nfsd/nfsfh.c
+++ b/trunk/fs/nfsd/nfsfh.c
@@ -187,11 +187,6 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
goto out;
}
- /* Set user creds for this exportpoint */
- error = nfserrno(nfsd_setuser(rqstp, exp));
- if (error)
- goto out;
-
/*
* Look up the dentry using the NFS file handle.
*/
@@ -246,17 +241,16 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
dprintk("nfsd: fh_verify - just checking\n");
dentry = fhp->fh_dentry;
exp = fhp->fh_export;
- /* Set user creds for this exportpoint; necessary even
- * in the "just checking" case because this may be a
- * filehandle that was created by fh_compose, and that
- * is about to be used in another nfsv4 compound
- * operation */
- error = nfserrno(nfsd_setuser(rqstp, exp));
- if (error)
- goto out;
}
cache_get(&exp->h);
+ /* Set user creds for this exportpoint; necessary even in the "just
+ * checking" case because this may be a filehandle that was created by
+ * fh_compose, and that is about to be used in another nfsv4 compound
+ * operation */
+ error = nfserrno(nfsd_setuser(rqstp, exp));
+ if (error)
+ goto out;
error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type);
if (error)
diff --git a/trunk/fs/partitions/Kconfig b/trunk/fs/partitions/Kconfig
index e478f1941831..c9a478099281 100644
--- a/trunk/fs/partitions/Kconfig
+++ b/trunk/fs/partitions/Kconfig
@@ -99,7 +99,7 @@ config IBM_PARTITION
config MAC_PARTITION
bool "Macintosh partition map support" if PARTITION_ADVANCED
- default y if (MAC || PPC_PMAC)
+ default y if MAC
help
Say Y here if you would like to use hard disks under Linux which
were partitioned on a Macintosh.
diff --git a/trunk/fs/ufs/namei.c b/trunk/fs/ufs/namei.c
index d344b411e261..abd5f23a426d 100644
--- a/trunk/fs/ufs/namei.c
+++ b/trunk/fs/ufs/namei.c
@@ -129,7 +129,7 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
struct inode * inode;
if (l > sb->s_blocksize)
- goto out_notlocked;
+ goto out;
lock_kernel();
inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO);
@@ -155,7 +155,6 @@ static int ufs_symlink (struct inode * dir, struct dentry * dentry,
err = ufs_add_nondir(dentry, inode);
out:
unlock_kernel();
-out_notlocked:
return err;
out_fail:
diff --git a/trunk/fs/xfs/linux-2.6/xfs_buf.h b/trunk/fs/xfs/linux-2.6/xfs_buf.h
index 7858703ed84c..ceda3a2859d2 100644
--- a/trunk/fs/xfs/linux-2.6/xfs_buf.h
+++ b/trunk/fs/xfs/linux-2.6/xfs_buf.h
@@ -246,8 +246,8 @@ extern void xfs_buf_trace(xfs_buf_t *, char *, void *, void *);
#define BUF_BUSY XBF_DONT_BLOCK
#define XFS_BUF_BFLAGS(bp) ((bp)->b_flags)
-#define XFS_BUF_ZEROFLAGS(bp) ((bp)->b_flags &= \
- ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI|XBF_ORDERED))
+#define XFS_BUF_ZEROFLAGS(bp) \
+ ((bp)->b_flags &= ~(XBF_READ|XBF_WRITE|XBF_ASYNC|XBF_DELWRI))
#define XFS_BUF_STALE(bp) ((bp)->b_flags |= XFS_B_STALE)
#define XFS_BUF_UNSTALE(bp) ((bp)->b_flags &= ~XFS_B_STALE)
diff --git a/trunk/fs/xfs/linux-2.6/xfs_super.c b/trunk/fs/xfs/linux-2.6/xfs_super.c
index 4754f342a5d3..9bdef9d51900 100644
--- a/trunk/fs/xfs/linux-2.6/xfs_super.c
+++ b/trunk/fs/xfs/linux-2.6/xfs_super.c
@@ -314,13 +314,6 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp)
return;
}
- if (xfs_readonly_buftarg(mp->m_ddev_targp)) {
- xfs_fs_cmn_err(CE_NOTE, mp,
- "Disabling barriers, underlying device is readonly");
- mp->m_flags &= ~XFS_MOUNT_BARRIER;
- return;
- }
-
error = xfs_barrier_test(mp);
if (error) {
xfs_fs_cmn_err(CE_NOTE, mp,
diff --git a/trunk/fs/xfs/quota/xfs_qm_bhv.c b/trunk/fs/xfs/quota/xfs_qm_bhv.c
index f137856c3261..e95e99f7168f 100644
--- a/trunk/fs/xfs/quota/xfs_qm_bhv.c
+++ b/trunk/fs/xfs/quota/xfs_qm_bhv.c
@@ -217,24 +217,17 @@ xfs_qm_statvfs(
return 0;
dp = &dqp->q_core;
- limit = dp->d_blk_softlimit ?
- be64_to_cpu(dp->d_blk_softlimit) :
- be64_to_cpu(dp->d_blk_hardlimit);
+ limit = dp->d_blk_softlimit ? dp->d_blk_softlimit : dp->d_blk_hardlimit;
if (limit && statp->f_blocks > limit) {
statp->f_blocks = limit;
- statp->f_bfree =
- (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ?
- (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0;
+ statp->f_bfree = (statp->f_blocks > dp->d_bcount) ?
+ (statp->f_blocks - dp->d_bcount) : 0;
}
-
- limit = dp->d_ino_softlimit ?
- be64_to_cpu(dp->d_ino_softlimit) :
- be64_to_cpu(dp->d_ino_hardlimit);
+ limit = dp->d_ino_softlimit ? dp->d_ino_softlimit : dp->d_ino_hardlimit;
if (limit && statp->f_files > limit) {
statp->f_files = limit;
- statp->f_ffree =
- (statp->f_files > be64_to_cpu(dp->d_icount)) ?
- (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0;
+ statp->f_ffree = (statp->f_files > dp->d_icount) ?
+ (statp->f_ffree - dp->d_icount) : 0;
}
xfs_qm_dqput(dqp);
diff --git a/trunk/fs/xfs/xfs_inode.c b/trunk/fs/xfs/xfs_inode.c
index 1f8ecff8553a..86c1bf0bba9e 100644
--- a/trunk/fs/xfs/xfs_inode.c
+++ b/trunk/fs/xfs/xfs_inode.c
@@ -334,9 +334,10 @@ xfs_itobp(
#if !defined(__KERNEL__)
ni = 0;
#elif defined(DEBUG)
- ni = BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog;
+ ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 :
+ (BBTOB(imap.im_len) >> mp->m_sb.sb_inodelog);
#else /* usual case */
- ni = 1;
+ ni = (imap_flags & XFS_IMAP_BULKSTAT) ? 0 : 1;
#endif
for (i = 0; i < ni; i++) {
@@ -347,15 +348,11 @@ xfs_itobp(
(i << mp->m_sb.sb_inodelog));
di_ok = INT_GET(dip->di_core.di_magic, ARCH_CONVERT) == XFS_DINODE_MAGIC &&
XFS_DINODE_GOOD_VERSION(INT_GET(dip->di_core.di_version, ARCH_CONVERT));
- if (unlikely(XFS_TEST_ERROR(!di_ok, mp,
- XFS_ERRTAG_ITOBP_INOTOBP,
- XFS_RANDOM_ITOBP_INOTOBP))) {
- if (imap_flags & XFS_IMAP_BULKSTAT) {
- xfs_trans_brelse(tp, bp);
- return XFS_ERROR(EINVAL);
- }
+ if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP,
+ XFS_RANDOM_ITOBP_INOTOBP))) {
#ifdef DEBUG
- cmn_err(CE_ALERT,
+ if (!(imap_flags & XFS_IMAP_BULKSTAT))
+ cmn_err(CE_ALERT,
"Device %s - bad inode magic/vsn "
"daddr %lld #%d (magic=%x)",
XFS_BUFTARG_NAME(mp->m_ddev_targp),
diff --git a/trunk/fs/xfs/xfs_log.c b/trunk/fs/xfs/xfs_log.c
index 21ac1a67e3e0..e730328636c3 100644
--- a/trunk/fs/xfs/xfs_log.c
+++ b/trunk/fs/xfs/xfs_log.c
@@ -1413,7 +1413,7 @@ xlog_sync(xlog_t *log,
ops = iclog->ic_header.h_num_logops;
INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops);
- bp = iclog->ic_bp;
+ bp = iclog->ic_bp;
ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1);
XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT)));
@@ -1430,14 +1430,15 @@ xlog_sync(xlog_t *log,
}
XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count);
XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */
- XFS_BUF_ZEROFLAGS(bp);
XFS_BUF_BUSY(bp);
XFS_BUF_ASYNC(bp);
/*
* Do an ordered write for the log block.
- * Its unnecessary to flush the first split block in the log wrap case.
+ *
+ * It may not be needed to flush the first split block in the log wrap
+ * case, but do it anyways to be safe -AK
*/
- if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER))
+ if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
XFS_BUF_ORDERED(bp);
ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
@@ -1459,7 +1460,7 @@ xlog_sync(xlog_t *log,
return error;
}
if (split) {
- bp = iclog->ic_log->l_xbuf;
+ bp = iclog->ic_log->l_xbuf;
ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) ==
(unsigned long)1);
XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
@@ -1467,7 +1468,6 @@ xlog_sync(xlog_t *log,
XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+
(__psint_t)count), split);
XFS_BUF_SET_FSPRIVATE(bp, iclog);
- XFS_BUF_ZEROFLAGS(bp);
XFS_BUF_BUSY(bp);
XFS_BUF_ASYNC(bp);
if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
diff --git a/trunk/fs/xfs/xfs_vfsops.c b/trunk/fs/xfs/xfs_vfsops.c
index b427d220a169..6c96391f3f1a 100644
--- a/trunk/fs/xfs/xfs_vfsops.c
+++ b/trunk/fs/xfs/xfs_vfsops.c
@@ -515,7 +515,7 @@ xfs_mount(
if (error)
goto error2;
- if (mp->m_flags & XFS_MOUNT_BARRIER)
+ if ((mp->m_flags & XFS_MOUNT_BARRIER) && !(vfsp->vfs_flag & VFS_RDONLY))
xfs_mountfs_check_barriers(mp);
error = XFS_IOINIT(vfsp, args, flags);
diff --git a/trunk/include/asm-arm/arch-iop3xx/iop331-irqs.h b/trunk/include/asm-arm/arch-iop3xx/iop331-irqs.h
index 7135ad7e335e..8ff73d487222 100644
--- a/trunk/include/asm-arm/arch-iop3xx/iop331-irqs.h
+++ b/trunk/include/asm-arm/arch-iop3xx/iop331-irqs.h
@@ -91,6 +91,7 @@
#define NR_IRQS NR_IOP331_IRQS
+#if defined(CONFIG_ARCH_IQ80331)
/*
* Interrupts available on the IQ80331 board
*/
@@ -110,6 +111,7 @@
#define IRQ_IQ80331_INTC IRQ_IOP331_XINT2
#define IRQ_IQ80331_INTD IRQ_IOP331_XINT3
+#elif defined(CONFIG_MACH_IQ80332)
/*
* Interrupts available on the IQ80332 board
*/
@@ -129,4 +131,6 @@
#define IRQ_IQ80332_INTC IRQ_IOP331_XINT2
#define IRQ_IQ80332_INTD IRQ_IOP331_XINT3
+#endif
+
#endif // _IOP331_IRQ_H_
diff --git a/trunk/include/asm-arm/arch-omap/clock.h b/trunk/include/asm-arm/arch-omap/clock.h
index f83003f5287b..3c4eb9fbe48a 100644
--- a/trunk/include/asm-arm/arch-omap/clock.h
+++ b/trunk/include/asm-arm/arch-omap/clock.h
@@ -48,6 +48,8 @@ struct clk_functions {
};
extern unsigned int mpurate;
+extern struct list_head clocks;
+extern spinlock_t clockfw_lock;
extern int clk_init(struct clk_functions * custom_clocks);
extern int clk_register(struct clk *clk);
diff --git a/trunk/include/asm-i386/kprobes.h b/trunk/include/asm-i386/kprobes.h
index 8774d06689da..0730a20f6db8 100644
--- a/trunk/include/asm-i386/kprobes.h
+++ b/trunk/include/asm-i386/kprobes.h
@@ -45,7 +45,6 @@ typedef u8 kprobe_opcode_t;
#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry
#define ARCH_SUPPORTS_KRETPROBES
#define ARCH_INACTIVE_KPROBE_COUNT 0
-#define flush_insn_slot(p) do { } while (0)
void arch_remove_kprobe(struct kprobe *p);
void kretprobe_trampoline(void);
diff --git a/trunk/include/asm-ia64/kprobes.h b/trunk/include/asm-ia64/kprobes.h
index 938904910115..2418a787c405 100644
--- a/trunk/include/asm-ia64/kprobes.h
+++ b/trunk/include/asm-ia64/kprobes.h
@@ -125,6 +125,5 @@ static inline void jprobe_return(void)
}
extern void invalidate_stacked_regs(void);
extern void flush_register_stack(void);
-extern void flush_insn_slot(struct kprobe *p);
#endif /* _ASM_KPROBES_H */
diff --git a/trunk/include/asm-powerpc/backlight.h b/trunk/include/asm-powerpc/backlight.h
index 8cf5c37c3817..58d4b6f8d827 100644
--- a/trunk/include/asm-powerpc/backlight.h
+++ b/trunk/include/asm-powerpc/backlight.h
@@ -30,12 +30,8 @@ static inline void pmac_backlight_key_down(void)
pmac_backlight_key(1);
}
-extern void pmac_backlight_set_legacy_brightness_pmu(int brightness);
extern int pmac_backlight_set_legacy_brightness(int brightness);
extern int pmac_backlight_get_legacy_brightness(void);
-extern void pmac_backlight_enable(void);
-extern void pmac_backlight_disable(void);
-
#endif /* __KERNEL__ */
#endif
diff --git a/trunk/include/asm-powerpc/kprobes.h b/trunk/include/asm-powerpc/kprobes.h
index 34e1f89a5fa0..2d0af52c823d 100644
--- a/trunk/include/asm-powerpc/kprobes.h
+++ b/trunk/include/asm-powerpc/kprobes.h
@@ -51,7 +51,6 @@ typedef unsigned int kprobe_opcode_t;
#define ARCH_SUPPORTS_KRETPROBES
#define ARCH_INACTIVE_KPROBE_COUNT 1
-#define flush_insn_slot(p) do { } while (0)
void kretprobe_trampoline(void);
extern void arch_remove_kprobe(struct kprobe *p);
diff --git a/trunk/include/asm-sparc64/kprobes.h b/trunk/include/asm-sparc64/kprobes.h
index c9f5c34d318c..15065af566c2 100644
--- a/trunk/include/asm-sparc64/kprobes.h
+++ b/trunk/include/asm-sparc64/kprobes.h
@@ -13,7 +13,6 @@ typedef u32 kprobe_opcode_t;
#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry
#define arch_remove_kprobe(p) do {} while (0)
#define ARCH_INACTIVE_KPROBE_COUNT 0
-#define flush_insn_slot(p) do { } while (0)
/* Architecture specific copy of original instruction*/
struct arch_specific_insn {
diff --git a/trunk/include/asm-sparc64/pgtable.h b/trunk/include/asm-sparc64/pgtable.h
index 1ba19eb34ce3..03f5bc9b6bec 100644
--- a/trunk/include/asm-sparc64/pgtable.h
+++ b/trunk/include/asm-sparc64/pgtable.h
@@ -339,7 +339,7 @@ static inline pgprot_t pgprot_noncached(pgprot_t prot)
" .section .sun4v_2insn_patch, \"ax\"\n"
" .word 661b\n"
" andn %0, %4, %0\n"
- " or %0, %5, %0\n"
+ " or %0, %3, %0\n"
" .previous\n"
: "=r" (val)
: "0" (val), "i" (_PAGE_CP_4U | _PAGE_CV_4U), "i" (_PAGE_E_4U),
diff --git a/trunk/include/asm-sparc64/sfp-machine.h b/trunk/include/asm-sparc64/sfp-machine.h
index 89d42431efb5..5015bb8d6c32 100644
--- a/trunk/include/asm-sparc64/sfp-machine.h
+++ b/trunk/include/asm-sparc64/sfp-machine.h
@@ -34,7 +34,7 @@
#define _FP_MUL_MEAT_D(R,X,Y) \
_FP_MUL_MEAT_1_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
#define _FP_MUL_MEAT_Q(R,X,Y) \
- _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+ _FP_MUL_MEAT_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm)
#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y)
diff --git a/trunk/include/asm-x86_64/calgary.h b/trunk/include/asm-x86_64/calgary.h
index 4e3919524240..fbfb50136edb 100644
--- a/trunk/include/asm-x86_64/calgary.h
+++ b/trunk/include/asm-x86_64/calgary.h
@@ -60,4 +60,9 @@ static inline int calgary_iommu_init(void) { return 1; }
static inline void detect_calgary(void) { return; }
#endif
+static inline unsigned int bus_to_phb(unsigned char busno)
+{
+ return ((busno % 15 == 0) ? 0 : busno / 2 + 1);
+}
+
#endif /* _ASM_X86_64_CALGARY_H */
diff --git a/trunk/include/asm-x86_64/kprobes.h b/trunk/include/asm-x86_64/kprobes.h
index cf5317898fb0..d36febd9bb18 100644
--- a/trunk/include/asm-x86_64/kprobes.h
+++ b/trunk/include/asm-x86_64/kprobes.h
@@ -47,7 +47,6 @@ typedef u8 kprobe_opcode_t;
void kretprobe_trampoline(void);
extern void arch_remove_kprobe(struct kprobe *p);
-#define flush_insn_slot(p) do { } while (0)
/* Architecture specific copy of original instruction*/
struct arch_specific_insn {
diff --git a/trunk/include/asm-x86_64/page.h b/trunk/include/asm-x86_64/page.h
index 10f346165cab..f7bf875aae40 100644
--- a/trunk/include/asm-x86_64/page.h
+++ b/trunk/include/asm-x86_64/page.h
@@ -19,7 +19,7 @@
#define EXCEPTION_STACK_ORDER 0
#define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
-#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1)
+#define DEBUG_STACK_ORDER EXCEPTION_STACK_ORDER
#define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
#define IRQSTACK_ORDER 2
diff --git a/trunk/include/asm-x86_64/swiotlb.h b/trunk/include/asm-x86_64/swiotlb.h
index ba94ab3d2673..5f9a01805821 100644
--- a/trunk/include/asm-x86_64/swiotlb.h
+++ b/trunk/include/asm-x86_64/swiotlb.h
@@ -42,8 +42,6 @@ extern void swiotlb_free_coherent (struct device *hwdev, size_t size,
extern int swiotlb_dma_supported(struct device *hwdev, u64 mask);
extern void swiotlb_init(void);
-extern int swiotlb_force;
-
#ifdef CONFIG_SWIOTLB
extern int swiotlb;
#else
diff --git a/trunk/include/linux/audit.h b/trunk/include/linux/audit.h
index 64f9f9e56ac5..b27d7debc5a1 100644
--- a/trunk/include/linux/audit.h
+++ b/trunk/include/linux/audit.h
@@ -327,31 +327,21 @@ extern void __audit_getname(const char *name);
extern void audit_putname(const char *name);
extern void __audit_inode(const char *name, const struct inode *inode);
extern void __audit_inode_child(const char *dname, const struct inode *inode,
- const struct inode *parent);
-extern void __audit_inode_update(const struct inode *inode);
-static inline int audit_dummy_context(void)
-{
- void *p = current->audit_context;
- return !p || *(int *)p;
-}
+ unsigned long pino);
static inline void audit_getname(const char *name)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
__audit_getname(name);
}
static inline void audit_inode(const char *name, const struct inode *inode) {
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
__audit_inode(name, inode);
}
static inline void audit_inode_child(const char *dname,
- const struct inode *inode,
- const struct inode *parent) {
- if (unlikely(!audit_dummy_context()))
- __audit_inode_child(dname, inode, parent);
-}
-static inline void audit_inode_update(const struct inode *inode) {
- if (unlikely(!audit_dummy_context()))
- __audit_inode_update(inode);
+ const struct inode *inode,
+ unsigned long pino) {
+ if (unlikely(current->audit_context))
+ __audit_inode_child(dname, inode, pino);
}
/* Private API (for audit.c only) */
@@ -375,61 +365,57 @@ extern int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_ipc_obj(ipcp);
return 0;
}
static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_ipc_set_perm(qbytes, uid, gid, mode);
return 0;
}
static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_mq_open(oflag, mode, u_attr);
return 0;
}
static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout);
return 0;
}
static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout);
return 0;
}
static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_mq_notify(mqdes, u_notification);
return 0;
}
static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
{
- if (unlikely(!audit_dummy_context()))
+ if (unlikely(current->audit_context))
return __audit_mq_getsetattr(mqdes, mqstat);
return 0;
}
-extern int audit_n_rules;
#else
#define audit_alloc(t) ({ 0; })
#define audit_free(t) do { ; } while (0)
#define audit_syscall_entry(ta,a,b,c,d,e) do { ; } while (0)
#define audit_syscall_exit(f,r) do { ; } while (0)
-#define audit_dummy_context() 1
#define audit_getname(n) do { ; } while (0)
#define audit_putname(n) do { ; } while (0)
#define __audit_inode(n,i) do { ; } while (0)
#define __audit_inode_child(d,i,p) do { ; } while (0)
-#define __audit_inode_update(i) do { ; } while (0)
#define audit_inode(n,i) do { ; } while (0)
#define audit_inode_child(d,i,p) do { ; } while (0)
-#define audit_inode_update(i) do { ; } while (0)
#define auditsc_get_stamp(c,t,s) do { BUG(); } while (0)
#define audit_get_loginuid(c) ({ -1; })
#define audit_ipc_obj(i) ({ 0; })
@@ -444,7 +430,6 @@ extern int audit_n_rules;
#define audit_mq_timedreceive(d,l,p,t) ({ 0; })
#define audit_mq_notify(d,n) ({ 0; })
#define audit_mq_getsetattr(d,s) ({ 0; })
-#define audit_n_rules 0
#endif
#ifdef CONFIG_AUDIT
diff --git a/trunk/include/linux/cn_proc.h b/trunk/include/linux/cn_proc.h
index 1c86d65bc4b9..dbb7769009be 100644
--- a/trunk/include/linux/cn_proc.h
+++ b/trunk/include/linux/cn_proc.h
@@ -57,8 +57,7 @@ struct proc_event {
PROC_EVENT_EXIT = 0x80000000
} what;
__u32 cpu;
- __u64 __attribute__((aligned(8))) timestamp_ns;
- /* Number of nano seconds since system boot */
+ struct timespec timestamp;
union { /* must be last field of proc_event struct */
struct {
__u32 err;
diff --git a/trunk/include/linux/delayacct.h b/trunk/include/linux/delayacct.h
index 11487b6e7127..7e8b6011b8f3 100644
--- a/trunk/include/linux/delayacct.h
+++ b/trunk/include/linux/delayacct.h
@@ -55,7 +55,7 @@ static inline void delayacct_tsk_init(struct task_struct *tsk)
{
/* reinitialize in case parent's non-null pointer was dup'ed*/
tsk->delays = NULL;
- if (delayacct_on)
+ if (unlikely(delayacct_on))
__delayacct_tsk_init(tsk);
}
@@ -80,7 +80,9 @@ static inline void delayacct_blkio_end(void)
static inline int delayacct_add_tsk(struct taskstats *d,
struct task_struct *tsk)
{
- if (!delayacct_on || !tsk->delays)
+ if (likely(!delayacct_on))
+ return -EINVAL;
+ if (!tsk->delays)
return 0;
return __delayacct_add_tsk(d, tsk);
}
diff --git a/trunk/include/linux/ext3_fs.h b/trunk/include/linux/ext3_fs.h
index 9f9cce7bd86d..5607e6457a65 100644
--- a/trunk/include/linux/ext3_fs.h
+++ b/trunk/include/linux/ext3_fs.h
@@ -492,15 +492,6 @@ static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
{
return container_of(inode, struct ext3_inode_info, vfs_inode);
}
-
-static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino)
-{
- return ino == EXT3_ROOT_INO ||
- ino == EXT3_JOURNAL_INO ||
- ino == EXT3_RESIZE_INO ||
- (ino >= EXT3_FIRST_INO(sb) &&
- ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count));
-}
#else
/* Assume that user mode programs are passing in an ext3fs superblock, not
* a kernel struct super_block. This will allow us to call the feature-test
diff --git a/trunk/include/linux/fb.h b/trunk/include/linux/fb.h
index 4ad0673b1995..405f44e44e5d 100644
--- a/trunk/include/linux/fb.h
+++ b/trunk/include/linux/fb.h
@@ -524,7 +524,7 @@ struct fb_event {
extern int fb_register_client(struct notifier_block *nb);
extern int fb_unregister_client(struct notifier_block *nb);
-extern int fb_notifier_call_chain(unsigned long val, void *v);
+
/*
* Pixmap structure definition
*
diff --git a/trunk/include/linux/fsnotify.h b/trunk/include/linux/fsnotify.h
index d4f219ffaa5d..cc5dec70c32c 100644
--- a/trunk/include/linux/fsnotify.h
+++ b/trunk/include/linux/fsnotify.h
@@ -67,7 +67,7 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
if (source) {
inotify_inode_queue_event(source, IN_MOVE_SELF, 0, NULL, NULL);
}
- audit_inode_child(new_name, source, new_dir);
+ audit_inode_child(new_name, source, new_dir->i_ino);
}
/*
@@ -98,7 +98,7 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
inode_dir_notify(inode, DN_CREATE);
inotify_inode_queue_event(inode, IN_CREATE, 0, dentry->d_name.name,
dentry->d_inode);
- audit_inode_child(dentry->d_name.name, dentry->d_inode, inode);
+ audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino);
}
/*
@@ -109,7 +109,7 @@ static inline void fsnotify_mkdir(struct inode *inode, struct dentry *dentry)
inode_dir_notify(inode, DN_CREATE);
inotify_inode_queue_event(inode, IN_CREATE | IN_ISDIR, 0,
dentry->d_name.name, dentry->d_inode);
- audit_inode_child(dentry->d_name.name, dentry->d_inode, inode);
+ audit_inode_child(dentry->d_name.name, dentry->d_inode, inode->i_ino);
}
/*
diff --git a/trunk/include/linux/futex.h b/trunk/include/linux/futex.h
index d097b5b72bc6..34c3a215f2cd 100644
--- a/trunk/include/linux/futex.h
+++ b/trunk/include/linux/futex.h
@@ -96,8 +96,7 @@ struct robust_list_head {
long do_futex(u32 __user *uaddr, int op, u32 val, unsigned long timeout,
u32 __user *uaddr2, u32 val2, u32 val3);
-extern int
-handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
+extern int handle_futex_death(u32 __user *uaddr, struct task_struct *curr);
#ifdef CONFIG_FUTEX
extern void exit_robust_list(struct task_struct *curr);
diff --git a/trunk/include/linux/ide.h b/trunk/include/linux/ide.h
index 99620451d958..dc7abef10965 100644
--- a/trunk/include/linux/ide.h
+++ b/trunk/include/linux/ide.h
@@ -571,7 +571,6 @@ typedef struct ide_drive_s {
u8 waiting_for_dma; /* dma currently in progress */
u8 unmask; /* okay to unmask other irqs */
u8 bswap; /* byte swap data */
- u8 noflush; /* don't attempt flushes */
u8 dsc_overlap; /* DSC overlap */
u8 nice1; /* give potential excess bandwidth */
diff --git a/trunk/include/linux/irq.h b/trunk/include/linux/irq.h
index fbf6d901e9c2..b48eae32dc61 100644
--- a/trunk/include/linux/irq.h
+++ b/trunk/include/linux/irq.h
@@ -47,8 +47,8 @@
#define IRQ_WAITING 0x00200000 /* IRQ not yet seen - for autodetection */
#define IRQ_LEVEL 0x00400000 /* IRQ level triggered */
#define IRQ_MASKED 0x00800000 /* IRQ masked - shouldn't be seen again */
-#define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */
#ifdef CONFIG_IRQ_PER_CPU
+# define IRQ_PER_CPU 0x01000000 /* IRQ is per CPU */
# define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
#else
# define CHECK_IRQ_PER_CPU(var) 0
@@ -58,7 +58,6 @@
#define IRQ_NOREQUEST 0x04000000 /* IRQ cannot be requested */
#define IRQ_NOAUTOEN 0x08000000 /* IRQ will not be enabled on request irq */
#define IRQ_DELAYED_DISABLE 0x10000000 /* IRQ disable (masking) happens delayed. */
-#define IRQ_WAKEUP 0x20000000 /* IRQ triggers system wakeup */
struct proc_dir_entry;
@@ -125,7 +124,6 @@ struct irq_chip {
* @action: the irq action chain
* @status: status information
* @depth: disable-depth, for nested irq_disable() calls
- * @wake_depth: enable depth, for multiple set_irq_wake() callers
* @irq_count: stats field to detect stalled irqs
* @irqs_unhandled: stats field for spurious unhandled interrupts
* @lock: locking for SMP
@@ -149,7 +147,6 @@ struct irq_desc {
unsigned int status; /* IRQ status */
unsigned int depth; /* nested irq disables */
- unsigned int wake_depth; /* nested wake enables */
unsigned int irq_count; /* For detecting broken IRQs */
unsigned int irqs_unhandled;
spinlock_t lock;
diff --git a/trunk/include/linux/jiffies.h b/trunk/include/linux/jiffies.h
index 329ebcffa106..043376920f51 100644
--- a/trunk/include/linux/jiffies.h
+++ b/trunk/include/linux/jiffies.h
@@ -47,8 +47,8 @@
* - (NOM / DEN) fits in (32 - LSH) bits.
* - (NOM % DEN) fits in (32 - LSH) bits.
*/
-#define SH_DIV(NOM,DEN,LSH) ( (((NOM) / (DEN)) << (LSH)) \
- + ((((NOM) % (DEN)) << (LSH)) + (DEN) / 2) / (DEN))
+#define SH_DIV(NOM,DEN,LSH) ( ((NOM / DEN) << LSH) \
+ + (((NOM % DEN) << LSH) + DEN / 2) / DEN)
/* HZ is the requested value. ACTHZ is actual HZ ("<< 8" is for accuracy) */
#define ACTHZ (SH_DIV (CLOCK_TICK_RATE, LATCH, 8))
diff --git a/trunk/include/linux/libata.h b/trunk/include/linux/libata.h
index 66c3100c2b94..6cc497a2b6da 100644
--- a/trunk/include/linux/libata.h
+++ b/trunk/include/linux/libata.h
@@ -265,14 +265,12 @@ enum {
/* ata_eh_info->flags */
ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */
- ATA_EHI_RESUME_LINK = (1 << 1), /* resume link (reset modifier) */
+ ATA_EHI_RESUME_LINK = (1 << 1), /* need to resume link */
ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */
ATA_EHI_QUIET = (1 << 3), /* be quiet */
ATA_EHI_DID_RESET = (1 << 16), /* already reset this port */
- ATA_EHI_RESET_MODIFIER_MASK = ATA_EHI_RESUME_LINK,
-
/* max repeat if error condition is still set after ->error_handler */
ATA_EH_MAX_REPEAT = 5,
diff --git a/trunk/include/linux/netfilter_bridge.h b/trunk/include/linux/netfilter_bridge.h
index 10c13dc4665b..31f02ba036ce 100644
--- a/trunk/include/linux/netfilter_bridge.h
+++ b/trunk/include/linux/netfilter_bridge.h
@@ -6,6 +6,7 @@
#include
#if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER)
+#include
#include
#endif
diff --git a/trunk/include/linux/pmu.h b/trunk/include/linux/pmu.h
index 783177387ac6..2ed807ddc08c 100644
--- a/trunk/include/linux/pmu.h
+++ b/trunk/include/linux/pmu.h
@@ -231,6 +231,7 @@ extern struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES];
extern unsigned int pmu_power_flags;
/* Backlight */
-extern void pmu_backlight_init(void);
+extern int disable_kernel_backlight;
+extern void pmu_backlight_init(struct device_node*);
#endif /* __KERNEL__ */
diff --git a/trunk/include/linux/security.h b/trunk/include/linux/security.h
index 6bc2aad494ff..f75303831d09 100644
--- a/trunk/include/linux/security.h
+++ b/trunk/include/linux/security.h
@@ -1109,16 +1109,6 @@ struct swap_info_struct;
* @name contains the name of the security module being unstacked.
* @ops contains a pointer to the struct security_operations of the module to unstack.
*
- * @secid_to_secctx:
- * Convert secid to security context.
- * @secid contains the security ID.
- * @secdata contains the pointer that stores the converted security context.
- *
- * @release_secctx:
- * Release the security context.
- * @secdata contains the security context.
- * @seclen contains the length of the security context.
- *
* This is the main security structure.
*/
struct security_operations {
@@ -1299,8 +1289,6 @@ struct security_operations {
int (*getprocattr)(struct task_struct *p, char *name, void *value, size_t size);
int (*setprocattr)(struct task_struct *p, char *name, void *value, size_t size);
- int (*secid_to_secctx)(u32 secid, char **secdata, u32 *seclen);
- void (*release_secctx)(char *secdata, u32 seclen);
#ifdef CONFIG_SECURITY_NETWORK
int (*unix_stream_connect) (struct socket * sock,
@@ -1329,7 +1317,7 @@ struct security_operations {
int (*socket_shutdown) (struct socket * sock, int how);
int (*socket_sock_rcv_skb) (struct sock * sk, struct sk_buff * skb);
int (*socket_getpeersec_stream) (struct socket *sock, char __user *optval, int __user *optlen, unsigned len);
- int (*socket_getpeersec_dgram) (struct socket *sock, struct sk_buff *skb, u32 *secid);
+ int (*socket_getpeersec_dgram) (struct sk_buff *skb, char **secdata, u32 *seclen);
int (*sk_alloc_security) (struct sock *sk, int family, gfp_t priority);
void (*sk_free_security) (struct sock *sk);
unsigned int (*sk_getsid) (struct sock *sk, struct flowi *fl, u8 dir);
@@ -2071,16 +2059,6 @@ static inline int security_netlink_recv(struct sk_buff * skb, int cap)
return security_ops->netlink_recv(skb, cap);
}
-static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
-{
- return security_ops->secid_to_secctx(secid, secdata, seclen);
-}
-
-static inline void security_release_secctx(char *secdata, u32 seclen)
-{
- return security_ops->release_secctx(secdata, seclen);
-}
-
/* prototypes */
extern int security_init (void);
extern int register_security (struct security_operations *ops);
@@ -2747,14 +2725,6 @@ static inline void securityfs_remove(struct dentry *dentry)
{
}
-static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
-{
- return -EOPNOTSUPP;
-}
-
-static inline void security_release_secctx(char *secdata, u32 seclen)
-{
-}
#endif /* CONFIG_SECURITY */
#ifdef CONFIG_SECURITY_NETWORK
@@ -2870,9 +2840,10 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __
return security_ops->socket_getpeersec_stream(sock, optval, optlen, len);
}
-static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata,
+ u32 *seclen)
{
- return security_ops->socket_getpeersec_dgram(sock, skb, secid);
+ return security_ops->socket_getpeersec_dgram(skb, secdata, seclen);
}
static inline int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
@@ -2997,7 +2968,8 @@ static inline int security_socket_getpeersec_stream(struct socket *sock, char __
return -ENOPROTOOPT;
}
-static inline int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+static inline int security_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata,
+ u32 *seclen)
{
return -ENOPROTOOPT;
}
diff --git a/trunk/include/linux/skbuff.h b/trunk/include/linux/skbuff.h
index 19c96d498e20..4307e764ef0a 100644
--- a/trunk/include/linux/skbuff.h
+++ b/trunk/include/linux/skbuff.h
@@ -604,17 +604,12 @@ static inline __u32 skb_queue_len(const struct sk_buff_head *list_)
return list_->qlen;
}
-/*
- * This function creates a split out lock class for each invocation;
- * this is needed for now since a whole lot of users of the skb-queue
- * infrastructure in drivers have different locking usage (in hardirq)
- * than the networking core (in softirq only). In the long run either the
- * network layer or drivers should need annotation to consolidate the
- * main types of usage into 3 classes.
- */
+extern struct lock_class_key skb_queue_lock_key;
+
static inline void skb_queue_head_init(struct sk_buff_head *list)
{
spin_lock_init(&list->lock);
+ lockdep_set_class(&list->lock, &skb_queue_lock_key);
list->prev = list->next = (struct sk_buff *)list;
list->qlen = 0;
}
@@ -1109,28 +1104,6 @@ static inline struct sk_buff *dev_alloc_skb(unsigned int length)
return __dev_alloc_skb(length, GFP_ATOMIC);
}
-extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
- unsigned int length, gfp_t gfp_mask);
-
-/**
- * netdev_alloc_skb - allocate an skbuff for rx on a specific device
- * @dev: network device to receive on
- * @length: length to allocate
- *
- * Allocate a new &sk_buff and assign it a usage count of one. The
- * buffer has unspecified headroom built in. Users should allocate
- * the headroom they think they need without accounting for the
- * built in space. The built in space is used for optimisations.
- *
- * %NULL is returned if there is no free memory. Although this function
- * allocates memory it can be called from an interrupt.
- */
-static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev,
- unsigned int length)
-{
- return __netdev_alloc_skb(dev, length, GFP_ATOMIC);
-}
-
/**
* skb_cow - copy header of skb when it is required
* @skb: buffer to cow
diff --git a/trunk/include/linux/usb.h b/trunk/include/linux/usb.h
index d2bd0c8e0154..c944e8f06a4a 100644
--- a/trunk/include/linux/usb.h
+++ b/trunk/include/linux/usb.h
@@ -103,7 +103,8 @@ enum usb_interface_condition {
* @condition: binding state of the interface: not bound, binding
* (in probe()), bound to a driver, or unbinding (in disconnect())
* @dev: driver model's view of this device
- * @class_dev: driver model's class view of this device.
+ * @usb_dev: if an interface is bound to the USB major, this will point
+ * to the sysfs representation for that device.
*
* USB device drivers attach to interfaces on a physical device. Each
* interface encapsulates a single high level function, such as feeding
@@ -143,7 +144,7 @@ struct usb_interface {
* bound to */
enum usb_interface_condition condition; /* state of binding */
struct device dev; /* interface specific device info */
- struct class_device *class_dev;
+ struct device *usb_dev; /* pointer to the usb class's device, if any */
};
#define to_usb_interface(d) container_of(d, struct usb_interface, dev)
#define interface_to_usbdev(intf) \
@@ -360,7 +361,7 @@ struct usb_device {
char *serial; /* iSerialNumber string, if present */
struct list_head filelist;
- struct class_device *class_dev;
+ struct device *usbfs_dev;
struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */
/*
diff --git a/trunk/include/linux/usb_usual.h b/trunk/include/linux/usb_usual.h
index e7fc5fed5b98..f38f43f20fae 100644
--- a/trunk/include/linux/usb_usual.h
+++ b/trunk/include/linux/usb_usual.h
@@ -44,9 +44,7 @@
US_FLAG(NO_WP_DETECT, 0x00000200) \
/* Don't check for write-protect */ \
US_FLAG(MAX_SECTORS_64, 0x00000400) \
- /* Sets max_sectors to 64 */ \
- US_FLAG(IGNORE_DEVICE, 0x00000800) \
- /* Don't claim device */
+ /* Sets max_sectors to 64 */
#define US_FLAG(name, value) US_FL_##name = value ,
enum { US_DO_ALL_FLAGS };
diff --git a/trunk/include/linux/videodev.h b/trunk/include/linux/videodev.h
index 518c7a32175e..41bc7e9603cd 100644
--- a/trunk/include/linux/videodev.h
+++ b/trunk/include/linux/videodev.h
@@ -12,11 +12,10 @@
#ifndef __LINUX_VIDEODEV_H
#define __LINUX_VIDEODEV_H
-#include
-
-#ifdef CONFIG_VIDEO_V4L1_COMPAT
#define HAVE_V4L1 1
+#include
+
struct video_capability
{
char name[32];
@@ -337,8 +336,6 @@ struct video_code
#define VID_HARDWARE_SN9C102 38
#define VID_HARDWARE_ARV 39
-#endif /* CONFIG_VIDEO_V4L1_COMPAT */
-
#endif /* __LINUX_VIDEODEV_H */
/*
diff --git a/trunk/include/linux/videodev2.h b/trunk/include/linux/videodev2.h
index b7146956a929..a62673dad76e 100644
--- a/trunk/include/linux/videodev2.h
+++ b/trunk/include/linux/videodev2.h
@@ -716,7 +716,7 @@ struct v4l2_ext_control
__s64 value64;
void *reserved;
};
-} __attribute__ ((packed));
+};
struct v4l2_ext_controls
{
diff --git a/trunk/include/media/v4l2-dev.h b/trunk/include/media/v4l2-dev.h
index f8665326ed9f..62dae1a8c441 100644
--- a/trunk/include/media/v4l2-dev.h
+++ b/trunk/include/media/v4l2-dev.h
@@ -341,14 +341,11 @@ extern int video_usercopy(struct inode *inode, struct file *file,
extern struct video_device* video_devdata(struct file*);
#define to_video_device(cd) container_of(cd, struct video_device, class_dev)
-static inline int
+static inline void
video_device_create_file(struct video_device *vfd,
struct class_device_attribute *attr)
{
- int ret = class_device_create_file(&vfd->class_dev, attr);
- if (ret < 0)
- printk(KERN_WARNING "%s error: %d\n", __FUNCTION__, ret);
- return ret;
+ class_device_create_file(&vfd->class_dev, attr);
}
static inline void
video_device_remove_file(struct video_device *vfd,
diff --git a/trunk/include/net/af_unix.h b/trunk/include/net/af_unix.h
index c0398f5a8cb9..2fec827c8801 100644
--- a/trunk/include/net/af_unix.h
+++ b/trunk/include/net/af_unix.h
@@ -54,13 +54,15 @@ struct unix_skb_parms {
struct ucred creds; /* Skb credentials */
struct scm_fp_list *fp; /* Passed files */
#ifdef CONFIG_SECURITY_NETWORK
- u32 secid; /* Security ID */
+ char *secdata; /* Security context */
+ u32 seclen; /* Security length */
#endif
};
#define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb))
#define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
-#define UNIXSID(skb) (&UNIXCB((skb)).secid)
+#define UNIXSECDATA(skb) (&UNIXCB((skb)).secdata)
+#define UNIXSECLEN(skb) (&UNIXCB((skb)).seclen)
#define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock)
#define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock)
diff --git a/trunk/include/net/ip6_route.h b/trunk/include/net/ip6_route.h
index 96b0e66406ec..ab29dafb1a6a 100644
--- a/trunk/include/net/ip6_route.h
+++ b/trunk/include/net/ip6_route.h
@@ -139,22 +139,16 @@ extern rwlock_t rt6_lock;
/*
* Store a destination cache entry in a socket
*/
-static inline void __ip6_dst_store(struct sock *sk, struct dst_entry *dst,
- struct in6_addr *daddr)
+static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
+ struct in6_addr *daddr)
{
struct ipv6_pinfo *np = inet6_sk(sk);
struct rt6_info *rt = (struct rt6_info *) dst;
+ write_lock(&sk->sk_dst_lock);
sk_setup_caps(sk, dst);
np->daddr_cache = daddr;
np->dst_cookie = rt->rt6i_node ? rt->rt6i_node->fn_sernum : 0;
-}
-
-static inline void ip6_dst_store(struct sock *sk, struct dst_entry *dst,
- struct in6_addr *daddr)
-{
- write_lock(&sk->sk_dst_lock);
- __ip6_dst_store(sk, dst, daddr);
write_unlock(&sk->sk_dst_lock);
}
diff --git a/trunk/include/net/ipv6.h b/trunk/include/net/ipv6.h
index ece7e8a84ffd..a8fdf7970b37 100644
--- a/trunk/include/net/ipv6.h
+++ b/trunk/include/net/ipv6.h
@@ -468,9 +468,6 @@ extern void ip6_flush_pending_frames(struct sock *sk);
extern int ip6_dst_lookup(struct sock *sk,
struct dst_entry **dst,
struct flowi *fl);
-extern int ip6_sk_dst_lookup(struct sock *sk,
- struct dst_entry **dst,
- struct flowi *fl);
/*
* skb processing functions
diff --git a/trunk/include/net/netdma.h b/trunk/include/net/netdma.h
index 7f53cd1d8b1e..ceae5ee85c04 100644
--- a/trunk/include/net/netdma.h
+++ b/trunk/include/net/netdma.h
@@ -29,7 +29,7 @@ static inline struct dma_chan *get_softnet_dma(void)
{
struct dma_chan *chan;
rcu_read_lock();
- chan = rcu_dereference(__get_cpu_var(softnet_data).net_dma);
+ chan = rcu_dereference(__get_cpu_var(softnet_data.net_dma));
if (chan)
dma_chan_get(chan);
rcu_read_unlock();
diff --git a/trunk/include/net/netevent.h b/trunk/include/net/netevent.h
deleted file mode 100644
index e5d216241423..000000000000
--- a/trunk/include/net/netevent.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef _NET_EVENT_H
-#define _NET_EVENT_H
-
-/*
- * Generic netevent notifiers
- *
- * Authors:
- * Tom Tucker
- * Steve Wise
- *
- * Changes:
- */
-#ifdef __KERNEL__
-
-#include
-
-struct netevent_redirect {
- struct dst_entry *old;
- struct dst_entry *new;
-};
-
-enum netevent_notif_type {
- NETEVENT_NEIGH_UPDATE = 1, /* arg is struct neighbour ptr */
- NETEVENT_PMTU_UPDATE, /* arg is struct dst_entry ptr */
- NETEVENT_REDIRECT, /* arg is struct netevent_redirect ptr */
-};
-
-extern int register_netevent_notifier(struct notifier_block *nb);
-extern int unregister_netevent_notifier(struct notifier_block *nb);
-extern int call_netevent_notifiers(unsigned long val, void *v);
-
-#endif
-#endif
diff --git a/trunk/include/net/scm.h b/trunk/include/net/scm.h
index 5637d5e22d5f..02daa097cdcd 100644
--- a/trunk/include/net/scm.h
+++ b/trunk/include/net/scm.h
@@ -3,7 +3,6 @@
#include
#include
-#include
/* Well, we should have at least one descriptor open
* to accept passed FDs 8)
@@ -21,7 +20,8 @@ struct scm_cookie
struct ucred creds; /* Skb credentials */
struct scm_fp_list *fp; /* Passed files */
#ifdef CONFIG_SECURITY_NETWORK
- u32 secid; /* Passed security ID */
+ char *secdata; /* Security context */
+ u32 seclen; /* Security length */
#endif
unsigned long seq; /* Connection seqno */
};
@@ -32,16 +32,6 @@ extern int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie
extern void __scm_destroy(struct scm_cookie *scm);
extern struct scm_fp_list * scm_fp_dup(struct scm_fp_list *fpl);
-#ifdef CONFIG_SECURITY_NETWORK
-static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm)
-{
- security_socket_getpeersec_dgram(sock, NULL, &scm->secid);
-}
-#else
-static __inline__ void unix_get_peersec_dgram(struct socket *sock, struct scm_cookie *scm)
-{ }
-#endif /* CONFIG_SECURITY_NETWORK */
-
static __inline__ void scm_destroy(struct scm_cookie *scm)
{
if (scm && scm->fp)
@@ -57,7 +47,6 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
scm->creds.pid = p->tgid;
scm->fp = NULL;
scm->seq = 0;
- unix_get_peersec_dgram(sock, scm);
if (msg->msg_controllen <= 0)
return 0;
return __scm_send(sock, msg, scm);
@@ -66,18 +55,8 @@ static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
#ifdef CONFIG_SECURITY_NETWORK
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
{
- char *secdata;
- u32 seclen;
- int err;
-
- if (test_bit(SOCK_PASSSEC, &sock->flags)) {
- err = security_secid_to_secctx(scm->secid, &secdata, &seclen);
-
- if (!err) {
- put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, seclen, secdata);
- security_release_secctx(secdata, seclen);
- }
- }
+ if (test_bit(SOCK_PASSSEC, &sock->flags) && scm->secdata != NULL)
+ put_cmsg(msg, SOL_SOCKET, SCM_SECURITY, scm->seclen, scm->secdata);
}
#else
static inline void scm_passec(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm)
diff --git a/trunk/include/net/tcp.h b/trunk/include/net/tcp.h
index 7a093d0aa0fe..0720bddff1e9 100644
--- a/trunk/include/net/tcp.h
+++ b/trunk/include/net/tcp.h
@@ -914,9 +914,6 @@ static inline void tcp_set_state(struct sock *sk, int state)
static inline void tcp_done(struct sock *sk)
{
- if(sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV)
- TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
-
tcp_set_state(sk, TCP_CLOSE);
tcp_clear_xmit_timers(sk);
diff --git a/trunk/ipc/msg.c b/trunk/ipc/msg.c
index 2b4fccf8ea55..cd92d342953e 100644
--- a/trunk/ipc/msg.c
+++ b/trunk/ipc/msg.c
@@ -1,6 +1,6 @@
/*
* linux/ipc/msg.c
- * Copyright (C) 1992 Krishna Balasubramanian
+ * Copyright (C) 1992 Krishna Balasubramanian
*
* Removed all the remaining kerneld mess
* Catch the -EFAULT stuff properly
@@ -41,24 +41,22 @@ int msg_ctlmax = MSGMAX;
int msg_ctlmnb = MSGMNB;
int msg_ctlmni = MSGMNI;
-/*
- * one msg_receiver structure for each sleeping receiver:
- */
+/* one msg_receiver structure for each sleeping receiver */
struct msg_receiver {
- struct list_head r_list;
- struct task_struct *r_tsk;
+ struct list_head r_list;
+ struct task_struct* r_tsk;
- int r_mode;
- long r_msgtype;
- long r_maxsize;
+ int r_mode;
+ long r_msgtype;
+ long r_maxsize;
- volatile struct msg_msg *r_msg;
+ struct msg_msg* volatile r_msg;
};
/* one msg_sender for each sleeping sender */
struct msg_sender {
- struct list_head list;
- struct task_struct *tsk;
+ struct list_head list;
+ struct task_struct* tsk;
};
#define SEARCH_ANY 1
@@ -66,42 +64,45 @@ struct msg_sender {
#define SEARCH_NOTEQUAL 3
#define SEARCH_LESSEQUAL 4
-static atomic_t msg_bytes = ATOMIC_INIT(0);
-static atomic_t msg_hdrs = ATOMIC_INIT(0);
+static atomic_t msg_bytes = ATOMIC_INIT(0);
+static atomic_t msg_hdrs = ATOMIC_INIT(0);
static struct ipc_ids msg_ids;
-#define msg_lock(id) ((struct msg_queue *)ipc_lock(&msg_ids, id))
-#define msg_unlock(msq) ipc_unlock(&(msq)->q_perm)
-#define msg_rmid(id) ((struct msg_queue *)ipc_rmid(&msg_ids, id))
-#define msg_checkid(msq, msgid) ipc_checkid(&msg_ids, &msq->q_perm, msgid)
-#define msg_buildid(id, seq) ipc_buildid(&msg_ids, id, seq)
+#define msg_lock(id) ((struct msg_queue*)ipc_lock(&msg_ids,id))
+#define msg_unlock(msq) ipc_unlock(&(msq)->q_perm)
+#define msg_rmid(id) ((struct msg_queue*)ipc_rmid(&msg_ids,id))
+#define msg_checkid(msq, msgid) \
+ ipc_checkid(&msg_ids,&msq->q_perm,msgid)
+#define msg_buildid(id, seq) \
+ ipc_buildid(&msg_ids, id, seq)
-static void freeque(struct msg_queue *msq, int id);
-static int newque(key_t key, int msgflg);
+static void freeque (struct msg_queue *msq, int id);
+static int newque (key_t key, int msgflg);
#ifdef CONFIG_PROC_FS
static int sysvipc_msg_proc_show(struct seq_file *s, void *it);
#endif
-void __init msg_init(void)
+void __init msg_init (void)
{
- ipc_init_ids(&msg_ids, msg_ctlmni);
+ ipc_init_ids(&msg_ids,msg_ctlmni);
ipc_init_proc_interface("sysvipc/msg",
" key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n",
&msg_ids,
sysvipc_msg_proc_show);
}
-static int newque(key_t key, int msgflg)
+static int newque (key_t key, int msgflg)
{
+ int id;
+ int retval;
struct msg_queue *msq;
- int id, retval;
- msq = ipc_rcu_alloc(sizeof(*msq));
- if (!msq)
+ msq = ipc_rcu_alloc(sizeof(*msq));
+ if (!msq)
return -ENOMEM;
- msq->q_perm.mode = msgflg & S_IRWXUGO;
+ msq->q_perm.mode = (msgflg & S_IRWXUGO);
msq->q_perm.key = key;
msq->q_perm.security = NULL;
@@ -112,13 +113,13 @@ static int newque(key_t key, int msgflg)
}
id = ipc_addid(&msg_ids, &msq->q_perm, msg_ctlmni);
- if (id == -1) {
+ if(id == -1) {
security_msg_queue_free(msq);
ipc_rcu_putref(msq);
return -ENOSPC;
}
- msq->q_id = msg_buildid(id, msq->q_perm.seq);
+ msq->q_id = msg_buildid(id,msq->q_perm.seq);
msq->q_stime = msq->q_rtime = 0;
msq->q_ctime = get_seconds();
msq->q_cbytes = msq->q_qnum = 0;
@@ -132,44 +133,44 @@ static int newque(key_t key, int msgflg)
return msq->q_id;
}
-static inline void ss_add(struct msg_queue *msq, struct msg_sender *mss)
+static inline void ss_add(struct msg_queue* msq, struct msg_sender* mss)
{
- mss->tsk = current;
- current->state = TASK_INTERRUPTIBLE;
- list_add_tail(&mss->list, &msq->q_senders);
+ mss->tsk=current;
+ current->state=TASK_INTERRUPTIBLE;
+ list_add_tail(&mss->list,&msq->q_senders);
}
-static inline void ss_del(struct msg_sender *mss)
+static inline void ss_del(struct msg_sender* mss)
{
- if (mss->list.next != NULL)
+ if(mss->list.next != NULL)
list_del(&mss->list);
}
-static void ss_wakeup(struct list_head *h, int kill)
+static void ss_wakeup(struct list_head* h, int kill)
{
struct list_head *tmp;
tmp = h->next;
while (tmp != h) {
- struct msg_sender *mss;
-
- mss = list_entry(tmp, struct msg_sender, list);
+ struct msg_sender* mss;
+
+ mss = list_entry(tmp,struct msg_sender,list);
tmp = tmp->next;
- if (kill)
- mss->list.next = NULL;
+ if(kill)
+ mss->list.next=NULL;
wake_up_process(mss->tsk);
}
}
-static void expunge_all(struct msg_queue *msq, int res)
+static void expunge_all(struct msg_queue* msq, int res)
{
struct list_head *tmp;
tmp = msq->q_receivers.next;
while (tmp != &msq->q_receivers) {
- struct msg_receiver *msr;
-
- msr = list_entry(tmp, struct msg_receiver, r_list);
+ struct msg_receiver* msr;
+
+ msr = list_entry(tmp,struct msg_receiver,r_list);
tmp = tmp->next;
msr->r_msg = NULL;
wake_up_process(msr->r_tsk);
@@ -177,28 +178,26 @@ static void expunge_all(struct msg_queue *msq, int res)
msr->r_msg = ERR_PTR(res);
}
}
-
-/*
- * freeque() wakes up waiters on the sender and receiver waiting queue,
- * removes the message queue from message queue ID
+/*
+ * freeque() wakes up waiters on the sender and receiver waiting queue,
+ * removes the message queue from message queue ID
* array, and cleans up all the messages associated with this queue.
*
* msg_ids.mutex and the spinlock for this message queue is hold
* before freeque() is called. msg_ids.mutex remains locked on exit.
*/
-static void freeque(struct msg_queue *msq, int id)
+static void freeque (struct msg_queue *msq, int id)
{
struct list_head *tmp;
- expunge_all(msq, -EIDRM);
- ss_wakeup(&msq->q_senders, 1);
+ expunge_all(msq,-EIDRM);
+ ss_wakeup(&msq->q_senders,1);
msq = msg_rmid(id);
msg_unlock(msq);
-
+
tmp = msq->q_messages.next;
- while (tmp != &msq->q_messages) {
- struct msg_msg *msg = list_entry(tmp, struct msg_msg, m_list);
-
+ while(tmp != &msq->q_messages) {
+ struct msg_msg* msg = list_entry(tmp,struct msg_msg,m_list);
tmp = tmp->next;
atomic_dec(&msg_hdrs);
free_msg(msg);
@@ -208,10 +207,10 @@ static void freeque(struct msg_queue *msq, int id)
ipc_rcu_putref(msq);
}
-asmlinkage long sys_msgget(key_t key, int msgflg)
+asmlinkage long sys_msgget (key_t key, int msgflg)
{
- struct msg_queue *msq;
int id, ret = -EPERM;
+ struct msg_queue *msq;
mutex_lock(&msg_ids.mutex);
if (key == IPC_PRIVATE)
@@ -225,34 +224,31 @@ asmlinkage long sys_msgget(key_t key, int msgflg)
ret = -EEXIST;
} else {
msq = msg_lock(id);
- BUG_ON(msq == NULL);
+ BUG_ON(msq==NULL);
if (ipcperms(&msq->q_perm, msgflg))
ret = -EACCES;
else {
int qid = msg_buildid(id, msq->q_perm.seq);
-
- ret = security_msg_queue_associate(msq, msgflg);
+ ret = security_msg_queue_associate(msq, msgflg);
if (!ret)
ret = qid;
}
msg_unlock(msq);
}
mutex_unlock(&msg_ids.mutex);
-
return ret;
}
-static inline unsigned long
-copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
+static inline unsigned long copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
{
switch(version) {
case IPC_64:
- return copy_to_user(buf, in, sizeof(*in));
+ return copy_to_user (buf, in, sizeof(*in));
case IPC_OLD:
- {
+ {
struct msqid_ds out;
- memset(&out, 0, sizeof(out));
+ memset(&out,0,sizeof(out));
ipc64_perm_to_ipc_perm(&in->msg_perm, &out.msg_perm);
@@ -260,18 +256,18 @@ copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
out.msg_rtime = in->msg_rtime;
out.msg_ctime = in->msg_ctime;
- if (in->msg_cbytes > USHRT_MAX)
+ if(in->msg_cbytes > USHRT_MAX)
out.msg_cbytes = USHRT_MAX;
else
out.msg_cbytes = in->msg_cbytes;
out.msg_lcbytes = in->msg_cbytes;
- if (in->msg_qnum > USHRT_MAX)
+ if(in->msg_qnum > USHRT_MAX)
out.msg_qnum = USHRT_MAX;
else
out.msg_qnum = in->msg_qnum;
- if (in->msg_qbytes > USHRT_MAX)
+ if(in->msg_qbytes > USHRT_MAX)
out.msg_qbytes = USHRT_MAX;
else
out.msg_qbytes = in->msg_qbytes;
@@ -280,8 +276,8 @@ copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
out.msg_lspid = in->msg_lspid;
out.msg_lrpid = in->msg_lrpid;
- return copy_to_user(buf, &out, sizeof(out));
- }
+ return copy_to_user (buf, &out, sizeof(out));
+ }
default:
return -EINVAL;
}
@@ -294,15 +290,14 @@ struct msq_setbuf {
mode_t mode;
};
-static inline unsigned long
-copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version)
+static inline unsigned long copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version)
{
switch(version) {
case IPC_64:
- {
+ {
struct msqid64_ds tbuf;
- if (copy_from_user(&tbuf, buf, sizeof(tbuf)))
+ if (copy_from_user (&tbuf, buf, sizeof (tbuf)))
return -EFAULT;
out->qbytes = tbuf.msg_qbytes;
@@ -311,61 +306,60 @@ copy_msqid_from_user(struct msq_setbuf *out, void __user *buf, int version)
out->mode = tbuf.msg_perm.mode;
return 0;
- }
+ }
case IPC_OLD:
- {
+ {
struct msqid_ds tbuf_old;
- if (copy_from_user(&tbuf_old, buf, sizeof(tbuf_old)))
+ if (copy_from_user (&tbuf_old, buf, sizeof (tbuf_old)))
return -EFAULT;
out->uid = tbuf_old.msg_perm.uid;
out->gid = tbuf_old.msg_perm.gid;
out->mode = tbuf_old.msg_perm.mode;
- if (tbuf_old.msg_qbytes == 0)
+ if(tbuf_old.msg_qbytes == 0)
out->qbytes = tbuf_old.msg_lqbytes;
else
out->qbytes = tbuf_old.msg_qbytes;
return 0;
- }
+ }
default:
return -EINVAL;
}
}
-asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
+asmlinkage long sys_msgctl (int msqid, int cmd, struct msqid_ds __user *buf)
{
- struct kern_ipc_perm *ipcp;
- struct msq_setbuf setbuf;
- struct msg_queue *msq;
int err, version;
-
+ struct msg_queue *msq;
+ struct msq_setbuf setbuf;
+ struct kern_ipc_perm *ipcp;
+
if (msqid < 0 || cmd < 0)
return -EINVAL;
version = ipc_parse_version(&cmd);
switch (cmd) {
- case IPC_INFO:
- case MSG_INFO:
- {
+ case IPC_INFO:
+ case MSG_INFO:
+ {
struct msginfo msginfo;
int max_id;
-
if (!buf)
return -EFAULT;
- /*
- * We must not return kernel stack data.
+ /* We must not return kernel stack data.
* due to padding, it's not enough
* to set all member fields.
*/
+
err = security_msg_queue_msgctl(NULL, cmd);
if (err)
return err;
- memset(&msginfo, 0, sizeof(msginfo));
+ memset(&msginfo,0,sizeof(msginfo));
msginfo.msgmni = msg_ctlmni;
msginfo.msgmax = msg_ctlmax;
msginfo.msgmnb = msg_ctlmnb;
@@ -383,37 +377,36 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
}
max_id = msg_ids.max_id;
mutex_unlock(&msg_ids.mutex);
- if (copy_to_user(buf, &msginfo, sizeof(struct msginfo)))
+ if (copy_to_user (buf, &msginfo, sizeof(struct msginfo)))
return -EFAULT;
- return (max_id < 0) ? 0 : max_id;
+ return (max_id < 0) ? 0: max_id;
}
case MSG_STAT:
case IPC_STAT:
{
struct msqid64_ds tbuf;
int success_return;
-
if (!buf)
return -EFAULT;
- if (cmd == MSG_STAT && msqid >= msg_ids.entries->size)
+ if(cmd == MSG_STAT && msqid >= msg_ids.entries->size)
return -EINVAL;
- memset(&tbuf, 0, sizeof(tbuf));
+ memset(&tbuf,0,sizeof(tbuf));
msq = msg_lock(msqid);
if (msq == NULL)
return -EINVAL;
- if (cmd == MSG_STAT) {
+ if(cmd == MSG_STAT) {
success_return = msg_buildid(msqid, msq->q_perm.seq);
} else {
err = -EIDRM;
- if (msg_checkid(msq, msqid))
+ if (msg_checkid(msq,msqid))
goto out_unlock;
success_return = 0;
}
err = -EACCES;
- if (ipcperms(&msq->q_perm, S_IRUGO))
+ if (ipcperms (&msq->q_perm, S_IRUGO))
goto out_unlock;
err = security_msg_queue_msgctl(msq, cmd);
@@ -437,7 +430,7 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
case IPC_SET:
if (!buf)
return -EFAULT;
- if (copy_msqid_from_user(&setbuf, buf, version))
+ if (copy_msqid_from_user (&setbuf, buf, version))
return -EFAULT;
break;
case IPC_RMID:
@@ -448,12 +441,12 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
mutex_lock(&msg_ids.mutex);
msq = msg_lock(msqid);
- err = -EINVAL;
+ err=-EINVAL;
if (msq == NULL)
goto out_up;
err = -EIDRM;
- if (msg_checkid(msq, msqid))
+ if (msg_checkid(msq,msqid))
goto out_unlock_up;
ipcp = &msq->q_perm;
@@ -461,16 +454,15 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
if (err)
goto out_unlock_up;
if (cmd==IPC_SET) {
- err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid,
- setbuf.mode);
+ err = audit_ipc_set_perm(setbuf.qbytes, setbuf.uid, setbuf.gid, setbuf.mode);
if (err)
goto out_unlock_up;
}
err = -EPERM;
- if (current->euid != ipcp->cuid &&
+ if (current->euid != ipcp->cuid &&
current->euid != ipcp->uid && !capable(CAP_SYS_ADMIN))
- /* We _could_ check for CAP_CHOWN above, but we don't */
+ /* We _could_ check for CAP_CHOWN above, but we don't */
goto out_unlock_up;
err = security_msg_queue_msgctl(msq, cmd);
@@ -488,22 +480,22 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
ipcp->uid = setbuf.uid;
ipcp->gid = setbuf.gid;
- ipcp->mode = (ipcp->mode & ~S_IRWXUGO) |
- (S_IRWXUGO & setbuf.mode);
+ ipcp->mode = (ipcp->mode & ~S_IRWXUGO) |
+ (S_IRWXUGO & setbuf.mode);
msq->q_ctime = get_seconds();
/* sleeping receivers might be excluded by
* stricter permissions.
*/
- expunge_all(msq, -EAGAIN);
+ expunge_all(msq,-EAGAIN);
/* sleeping senders might be able to send
* due to a larger queue size.
*/
- ss_wakeup(&msq->q_senders, 0);
+ ss_wakeup(&msq->q_senders,0);
msg_unlock(msq);
break;
}
case IPC_RMID:
- freeque(msq, msqid);
+ freeque (msq, msqid);
break;
}
err = 0;
@@ -518,44 +510,41 @@ asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
return err;
}
-static int testmsg(struct msg_msg *msg, long type, int mode)
+static int testmsg(struct msg_msg* msg,long type,int mode)
{
switch(mode)
{
case SEARCH_ANY:
return 1;
case SEARCH_LESSEQUAL:
- if (msg->m_type <=type)
+ if(msg->m_type <=type)
return 1;
break;
case SEARCH_EQUAL:
- if (msg->m_type == type)
+ if(msg->m_type == type)
return 1;
break;
case SEARCH_NOTEQUAL:
- if (msg->m_type != type)
+ if(msg->m_type != type)
return 1;
break;
}
return 0;
}
-static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
+static inline int pipelined_send(struct msg_queue* msq, struct msg_msg* msg)
{
- struct list_head *tmp;
+ struct list_head* tmp;
tmp = msq->q_receivers.next;
while (tmp != &msq->q_receivers) {
- struct msg_receiver *msr;
-
- msr = list_entry(tmp, struct msg_receiver, r_list);
+ struct msg_receiver* msr;
+ msr = list_entry(tmp,struct msg_receiver,r_list);
tmp = tmp->next;
- if (testmsg(msg, msr->r_msgtype, msr->r_mode) &&
- !security_msg_queue_msgrcv(msq, msg, msr->r_tsk,
- msr->r_msgtype, msr->r_mode)) {
-
+ if(testmsg(msg,msr->r_msgtype,msr->r_mode) &&
+ !security_msg_queue_msgrcv(msq, msg, msr->r_tsk, msr->r_msgtype, msr->r_mode)) {
list_del(&msr->r_list);
- if (msr->r_maxsize < msg->m_ts) {
+ if(msr->r_maxsize < msg->m_ts) {
msr->r_msg = NULL;
wake_up_process(msr->r_tsk);
smp_mb();
@@ -567,7 +556,6 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
wake_up_process(msr->r_tsk);
smp_mb();
msr->r_msg = msg;
-
return 1;
}
}
@@ -575,41 +563,40 @@ static inline int pipelined_send(struct msg_queue *msq, struct msg_msg *msg)
return 0;
}
-asmlinkage long
-sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
+asmlinkage long sys_msgsnd (int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
{
struct msg_queue *msq;
struct msg_msg *msg;
long mtype;
int err;
-
+
if (msgsz > msg_ctlmax || (long) msgsz < 0 || msqid < 0)
return -EINVAL;
if (get_user(mtype, &msgp->mtype))
- return -EFAULT;
+ return -EFAULT;
if (mtype < 1)
return -EINVAL;
msg = load_msg(msgp->mtext, msgsz);
- if (IS_ERR(msg))
+ if(IS_ERR(msg))
return PTR_ERR(msg);
msg->m_type = mtype;
msg->m_ts = msgsz;
msq = msg_lock(msqid);
- err = -EINVAL;
- if (msq == NULL)
+ err=-EINVAL;
+ if(msq==NULL)
goto out_free;
err= -EIDRM;
- if (msg_checkid(msq, msqid))
+ if (msg_checkid(msq,msqid))
goto out_unlock_free;
for (;;) {
struct msg_sender s;
- err = -EACCES;
+ err=-EACCES;
if (ipcperms(&msq->q_perm, S_IWUGO))
goto out_unlock_free;
@@ -617,14 +604,14 @@ sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
if (err)
goto out_unlock_free;
- if (msgsz + msq->q_cbytes <= msq->q_qbytes &&
+ if(msgsz + msq->q_cbytes <= msq->q_qbytes &&
1 + msq->q_qnum <= msq->q_qbytes) {
break;
}
/* queue full, wait: */
- if (msgflg & IPC_NOWAIT) {
- err = -EAGAIN;
+ if(msgflg&IPC_NOWAIT) {
+ err=-EAGAIN;
goto out_unlock_free;
}
ss_add(msq, &s);
@@ -639,9 +626,9 @@ sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
goto out_unlock_free;
}
ss_del(&s);
-
+
if (signal_pending(current)) {
- err = -ERESTARTNOHAND;
+ err=-ERESTARTNOHAND;
goto out_unlock_free;
}
}
@@ -649,47 +636,47 @@ sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
msq->q_lspid = current->tgid;
msq->q_stime = get_seconds();
- if (!pipelined_send(msq, msg)) {
+ if(!pipelined_send(msq,msg)) {
/* noone is waiting for this message, enqueue it */
- list_add_tail(&msg->m_list, &msq->q_messages);
+ list_add_tail(&msg->m_list,&msq->q_messages);
msq->q_cbytes += msgsz;
msq->q_qnum++;
- atomic_add(msgsz, &msg_bytes);
+ atomic_add(msgsz,&msg_bytes);
atomic_inc(&msg_hdrs);
}
-
+
err = 0;
msg = NULL;
out_unlock_free:
msg_unlock(msq);
out_free:
- if (msg != NULL)
+ if(msg!=NULL)
free_msg(msg);
return err;
}
-static inline int convert_mode(long *msgtyp, int msgflg)
+static inline int convert_mode(long* msgtyp, int msgflg)
{
- /*
+ /*
* find message of correct type.
* msgtyp = 0 => get first.
* msgtyp > 0 => get first message of matching type.
- * msgtyp < 0 => get message with least type must be < abs(msgtype).
+ * msgtyp < 0 => get message with least type must be < abs(msgtype).
*/
- if (*msgtyp == 0)
+ if(*msgtyp==0)
return SEARCH_ANY;
- if (*msgtyp < 0) {
- *msgtyp = -*msgtyp;
+ if(*msgtyp<0) {
+ *msgtyp=-(*msgtyp);
return SEARCH_LESSEQUAL;
}
- if (msgflg & MSG_EXCEPT)
+ if(msgflg & MSG_EXCEPT)
return SEARCH_NOTEQUAL;
return SEARCH_EQUAL;
}
-asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
- long msgtyp, int msgflg)
+asmlinkage long sys_msgrcv (int msqid, struct msgbuf __user *msgp, size_t msgsz,
+ long msgtyp, int msgflg)
{
struct msg_queue *msq;
struct msg_msg *msg;
@@ -697,51 +684,44 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
if (msqid < 0 || (long) msgsz < 0)
return -EINVAL;
- mode = convert_mode(&msgtyp, msgflg);
+ mode = convert_mode(&msgtyp,msgflg);
msq = msg_lock(msqid);
- if (msq == NULL)
+ if(msq==NULL)
return -EINVAL;
msg = ERR_PTR(-EIDRM);
- if (msg_checkid(msq, msqid))
+ if (msg_checkid(msq,msqid))
goto out_unlock;
for (;;) {
struct msg_receiver msr_d;
- struct list_head *tmp;
+ struct list_head* tmp;
msg = ERR_PTR(-EACCES);
- if (ipcperms(&msq->q_perm, S_IRUGO))
+ if (ipcperms (&msq->q_perm, S_IRUGO))
goto out_unlock;
msg = ERR_PTR(-EAGAIN);
tmp = msq->q_messages.next;
while (tmp != &msq->q_messages) {
struct msg_msg *walk_msg;
-
- walk_msg = list_entry(tmp, struct msg_msg, m_list);
- if (testmsg(walk_msg, msgtyp, mode) &&
- !security_msg_queue_msgrcv(msq, walk_msg, current,
- msgtyp, mode)) {
-
+ walk_msg = list_entry(tmp,struct msg_msg,m_list);
+ if(testmsg(walk_msg,msgtyp,mode) &&
+ !security_msg_queue_msgrcv(msq, walk_msg, current, msgtyp, mode)) {
msg = walk_msg;
- if (mode == SEARCH_LESSEQUAL &&
- walk_msg->m_type != 1) {
- msg = walk_msg;
- msgtyp = walk_msg->m_type - 1;
+ if(mode == SEARCH_LESSEQUAL && walk_msg->m_type != 1) {
+ msg=walk_msg;
+ msgtyp=walk_msg->m_type-1;
} else {
- msg = walk_msg;
+ msg=walk_msg;
break;
}
}
tmp = tmp->next;
}
- if (!IS_ERR(msg)) {
- /*
- * Found a suitable message.
- * Unlink it from the queue.
- */
+ if(!IS_ERR(msg)) {
+ /* Found a suitable message. Unlink it from the queue. */
if ((msgsz < msg->m_ts) && !(msgflg & MSG_NOERROR)) {
msg = ERR_PTR(-E2BIG);
goto out_unlock;
@@ -751,9 +731,9 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
msq->q_rtime = get_seconds();
msq->q_lrpid = current->tgid;
msq->q_cbytes -= msg->m_ts;
- atomic_sub(msg->m_ts, &msg_bytes);
+ atomic_sub(msg->m_ts,&msg_bytes);
atomic_dec(&msg_hdrs);
- ss_wakeup(&msq->q_senders, 0);
+ ss_wakeup(&msq->q_senders,0);
msg_unlock(msq);
break;
}
@@ -762,13 +742,13 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
msg = ERR_PTR(-ENOMSG);
goto out_unlock;
}
- list_add_tail(&msr_d.r_list, &msq->q_receivers);
+ list_add_tail(&msr_d.r_list,&msq->q_receivers);
msr_d.r_tsk = current;
msr_d.r_msgtype = msgtyp;
msr_d.r_mode = mode;
- if (msgflg & MSG_NOERROR)
+ if(msgflg & MSG_NOERROR)
msr_d.r_maxsize = INT_MAX;
- else
+ else
msr_d.r_maxsize = msgsz;
msr_d.r_msg = ERR_PTR(-EAGAIN);
current->state = TASK_INTERRUPTIBLE;
@@ -793,17 +773,17 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
* wake_up_process(). There is a race with exit(), see
* ipc/mqueue.c for the details.
*/
- msg = (struct msg_msg*)msr_d.r_msg;
+ msg = (struct msg_msg*) msr_d.r_msg;
while (msg == NULL) {
cpu_relax();
- msg = (struct msg_msg *)msr_d.r_msg;
+ msg = (struct msg_msg*) msr_d.r_msg;
}
/* Lockless receive, part 3:
* If there is a message or an error then accept it without
* locking.
*/
- if (msg != ERR_PTR(-EAGAIN)) {
+ if(msg != ERR_PTR(-EAGAIN)) {
rcu_read_unlock();
break;
}
@@ -818,7 +798,7 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
* Repeat test after acquiring the spinlock.
*/
msg = (struct msg_msg*)msr_d.r_msg;
- if (msg != ERR_PTR(-EAGAIN))
+ if(msg != ERR_PTR(-EAGAIN))
goto out_unlock;
list_del(&msr_d.r_list);
@@ -830,15 +810,14 @@ asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
}
}
if (IS_ERR(msg))
- return PTR_ERR(msg);
+ return PTR_ERR(msg);
msgsz = (msgsz > msg->m_ts) ? msg->m_ts : msgsz;
if (put_user (msg->m_type, &msgp->mtype) ||
store_msg(msgp->mtext, msg, msgsz)) {
- msgsz = -EFAULT;
+ msgsz = -EFAULT;
}
free_msg(msg);
-
return msgsz;
}
@@ -848,20 +827,20 @@ static int sysvipc_msg_proc_show(struct seq_file *s, void *it)
struct msg_queue *msq = it;
return seq_printf(s,
- "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n",
- msq->q_perm.key,
- msq->q_id,
- msq->q_perm.mode,
- msq->q_cbytes,
- msq->q_qnum,
- msq->q_lspid,
- msq->q_lrpid,
- msq->q_perm.uid,
- msq->q_perm.gid,
- msq->q_perm.cuid,
- msq->q_perm.cgid,
- msq->q_stime,
- msq->q_rtime,
- msq->q_ctime);
+ "%10d %10d %4o %10lu %10lu %5u %5u %5u %5u %5u %5u %10lu %10lu %10lu\n",
+ msq->q_perm.key,
+ msq->q_id,
+ msq->q_perm.mode,
+ msq->q_cbytes,
+ msq->q_qnum,
+ msq->q_lspid,
+ msq->q_lrpid,
+ msq->q_perm.uid,
+ msq->q_perm.gid,
+ msq->q_perm.cuid,
+ msq->q_perm.cgid,
+ msq->q_stime,
+ msq->q_rtime,
+ msq->q_ctime);
}
#endif
diff --git a/trunk/kernel/audit.c b/trunk/kernel/audit.c
index 0a36091ed712..d417ca1db79b 100644
--- a/trunk/kernel/audit.c
+++ b/trunk/kernel/audit.c
@@ -690,7 +690,9 @@ static const struct inotify_operations audit_inotify_ops = {
/* Initialize audit support at boot time. */
static int __init audit_init(void)
{
+#ifdef CONFIG_AUDITSYSCALL
int i;
+#endif
printk(KERN_INFO "audit: initializing netlink socket (%s)\n",
audit_default ? "enabled" : "disabled");
@@ -715,10 +717,10 @@ static int __init audit_init(void)
audit_ih = inotify_init(&audit_inotify_ops);
if (IS_ERR(audit_ih))
audit_panic("cannot initialize inotify handle");
-#endif
for (i = 0; i < AUDIT_INODE_BUCKETS; i++)
INIT_LIST_HEAD(&audit_inode_hash[i]);
+#endif
return 0;
}
diff --git a/trunk/kernel/auditfilter.c b/trunk/kernel/auditfilter.c
index 6a9a5c5a4e7d..5b4e16276ca0 100644
--- a/trunk/kernel/auditfilter.c
+++ b/trunk/kernel/auditfilter.c
@@ -442,7 +442,6 @@ static struct audit_entry *audit_rule_to_entry(struct audit_rule *rule)
case AUDIT_EQUAL:
break;
default:
- err = -EINVAL;
goto exit_free;
}
}
@@ -580,7 +579,6 @@ static struct audit_entry *audit_data_to_entry(struct audit_rule_data *data,
case AUDIT_EQUAL:
break;
default:
- err = -EINVAL;
goto exit_free;
}
}
@@ -1136,14 +1134,6 @@ static inline int audit_add_rule(struct audit_entry *entry,
struct audit_watch *watch = entry->rule.watch;
struct nameidata *ndp, *ndw;
int h, err, putnd_needed = 0;
-#ifdef CONFIG_AUDITSYSCALL
- int dont_count = 0;
-
- /* If either of these, don't count towards total */
- if (entry->rule.listnr == AUDIT_FILTER_USER ||
- entry->rule.listnr == AUDIT_FILTER_TYPE)
- dont_count = 1;
-#endif
if (inode_f) {
h = audit_hash_ino(inode_f->val);
@@ -1184,10 +1174,6 @@ static inline int audit_add_rule(struct audit_entry *entry,
} else {
list_add_tail_rcu(&entry->list, list);
}
-#ifdef CONFIG_AUDITSYSCALL
- if (!dont_count)
- audit_n_rules++;
-#endif
mutex_unlock(&audit_filter_mutex);
if (putnd_needed)
@@ -1212,14 +1198,6 @@ static inline int audit_del_rule(struct audit_entry *entry,
struct audit_watch *watch, *tmp_watch = entry->rule.watch;
LIST_HEAD(inotify_list);
int h, ret = 0;
-#ifdef CONFIG_AUDITSYSCALL
- int dont_count = 0;
-
- /* If either of these, don't count towards total */
- if (entry->rule.listnr == AUDIT_FILTER_USER ||
- entry->rule.listnr == AUDIT_FILTER_TYPE)
- dont_count = 1;
-#endif
if (inode_f) {
h = audit_hash_ino(inode_f->val);
@@ -1257,10 +1235,6 @@ static inline int audit_del_rule(struct audit_entry *entry,
list_del_rcu(&e->list);
call_rcu(&e->rcu, audit_free_rule_rcu);
-#ifdef CONFIG_AUDITSYSCALL
- if (!dont_count)
- audit_n_rules--;
-#endif
mutex_unlock(&audit_filter_mutex);
if (!list_empty(&inotify_list))
diff --git a/trunk/kernel/auditsc.c b/trunk/kernel/auditsc.c
index efc1b74bebf3..ae40ac8c39e7 100644
--- a/trunk/kernel/auditsc.c
+++ b/trunk/kernel/auditsc.c
@@ -85,9 +85,6 @@ extern int audit_enabled;
/* Indicates that audit should log the full pathname. */
#define AUDIT_NAME_FULL -1
-/* number of audit rules */
-int audit_n_rules;
-
/* When fs/namei.c:getname() is called, we store the pointer in name and
* we don't let putname() free it (instead we free all of the saved
* pointers at syscall exit time).
@@ -177,7 +174,6 @@ struct audit_aux_data_path {
/* The per-task audit context. */
struct audit_context {
- int dummy; /* must be the first element */
int in_syscall; /* 1 if task is in a syscall */
enum audit_state state;
unsigned int serial; /* serial number for record */
@@ -518,7 +514,7 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk,
context->return_valid = return_valid;
context->return_code = return_code;
- if (context->in_syscall && !context->dummy && !context->auditable) {
+ if (context->in_syscall && !context->auditable) {
enum audit_state state;
state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]);
@@ -534,7 +530,17 @@ static inline struct audit_context *audit_get_context(struct task_struct *tsk,
}
get_context:
-
+ context->pid = tsk->pid;
+ context->ppid = sys_getppid(); /* sic. tsk == current in all cases */
+ context->uid = tsk->uid;
+ context->gid = tsk->gid;
+ context->euid = tsk->euid;
+ context->suid = tsk->suid;
+ context->fsuid = tsk->fsuid;
+ context->egid = tsk->egid;
+ context->sgid = tsk->sgid;
+ context->fsgid = tsk->fsgid;
+ context->personality = tsk->personality;
tsk->audit_context = NULL;
return context;
}
@@ -743,17 +749,6 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts
const char *tty;
/* tsk == current */
- context->pid = tsk->pid;
- context->ppid = sys_getppid(); /* sic. tsk == current in all cases */
- context->uid = tsk->uid;
- context->gid = tsk->gid;
- context->euid = tsk->euid;
- context->suid = tsk->suid;
- context->fsuid = tsk->fsuid;
- context->egid = tsk->egid;
- context->sgid = tsk->sgid;
- context->fsgid = tsk->fsgid;
- context->personality = tsk->personality;
ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL);
if (!ab)
@@ -1071,8 +1066,7 @@ void audit_syscall_entry(int arch, int major,
context->argv[3] = a4;
state = context->state;
- context->dummy = !audit_n_rules;
- if (!context->dummy && (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT))
+ if (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT)
state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]);
if (likely(state == AUDIT_DISABLED))
return;
@@ -1205,18 +1199,14 @@ void audit_putname(const char *name)
#endif
}
-/* Copy inode data into an audit_names. */
-static void audit_copy_inode(struct audit_names *name, const struct inode *inode)
+static void audit_inode_context(int idx, const struct inode *inode)
{
- name->ino = inode->i_ino;
- name->dev = inode->i_sb->s_dev;
- name->mode = inode->i_mode;
- name->uid = inode->i_uid;
- name->gid = inode->i_gid;
- name->rdev = inode->i_rdev;
- selinux_get_inode_sid(inode, &name->osid);
+ struct audit_context *context = current->audit_context;
+
+ selinux_get_inode_sid(inode, &context->names[idx].osid);
}
+
/**
* audit_inode - store the inode and device from a lookup
* @name: name being audited
@@ -1250,14 +1240,20 @@ void __audit_inode(const char *name, const struct inode *inode)
++context->ino_count;
#endif
}
- audit_copy_inode(&context->names[idx], inode);
+ context->names[idx].ino = inode->i_ino;
+ context->names[idx].dev = inode->i_sb->s_dev;
+ context->names[idx].mode = inode->i_mode;
+ context->names[idx].uid = inode->i_uid;
+ context->names[idx].gid = inode->i_gid;
+ context->names[idx].rdev = inode->i_rdev;
+ audit_inode_context(idx, inode);
}
/**
* audit_inode_child - collect inode info for created/removed objects
* @dname: inode's dentry name
* @inode: inode being audited
- * @parent: inode of dentry parent
+ * @pino: inode number of dentry parent
*
* For syscalls that create or remove filesystem objects, audit_inode
* can only collect information for the filesystem object's parent.
@@ -1268,7 +1264,7 @@ void __audit_inode(const char *name, const struct inode *inode)
* unsuccessful attempts.
*/
void __audit_inode_child(const char *dname, const struct inode *inode,
- const struct inode *parent)
+ unsigned long pino)
{
int idx;
struct audit_context *context = current->audit_context;
@@ -1282,7 +1278,7 @@ void __audit_inode_child(const char *dname, const struct inode *inode,
if (!dname)
goto update_context;
for (idx = 0; idx < context->name_count; idx++)
- if (context->names[idx].ino == parent->i_ino) {
+ if (context->names[idx].ino == pino) {
const char *name = context->names[idx].name;
if (!name)
@@ -1306,47 +1302,16 @@ void __audit_inode_child(const char *dname, const struct inode *inode,
context->names[idx].name_len = AUDIT_NAME_FULL;
context->names[idx].name_put = 0; /* don't call __putname() */
- if (!inode)
- context->names[idx].ino = (unsigned long)-1;
- else
- audit_copy_inode(&context->names[idx], inode);
-
- /* A parent was not found in audit_names, so copy the inode data for the
- * provided parent. */
- if (!found_name) {
- idx = context->name_count++;
-#if AUDIT_DEBUG
- context->ino_count++;
-#endif
- audit_copy_inode(&context->names[idx], parent);
- }
-}
-
-/**
- * audit_inode_update - update inode info for last collected name
- * @inode: inode being audited
- *
- * When open() is called on an existing object with the O_CREAT flag, the inode
- * data audit initially collects is incorrect. This additional hook ensures
- * audit has the inode data for the actual object to be opened.
- */
-void __audit_inode_update(const struct inode *inode)
-{
- struct audit_context *context = current->audit_context;
- int idx;
-
- if (!context->in_syscall || !inode)
- return;
-
- if (context->name_count == 0) {
- context->name_count++;
-#if AUDIT_DEBUG
- context->ino_count++;
-#endif
- }
- idx = context->name_count - 1;
-
- audit_copy_inode(&context->names[idx], inode);
+ if (inode) {
+ context->names[idx].ino = inode->i_ino;
+ context->names[idx].dev = inode->i_sb->s_dev;
+ context->names[idx].mode = inode->i_mode;
+ context->names[idx].uid = inode->i_uid;
+ context->names[idx].gid = inode->i_gid;
+ context->names[idx].rdev = inode->i_rdev;
+ audit_inode_context(idx, inode);
+ } else
+ context->names[idx].ino = (unsigned long)-1;
}
/**
@@ -1677,7 +1642,7 @@ int audit_bprm(struct linux_binprm *bprm)
unsigned long p, next;
void *to;
- if (likely(!audit_enabled || !context || context->dummy))
+ if (likely(!audit_enabled || !context))
return 0;
ax = kmalloc(sizeof(*ax) + PAGE_SIZE * MAX_ARG_PAGES - bprm->p,
@@ -1715,7 +1680,7 @@ int audit_socketcall(int nargs, unsigned long *args)
struct audit_aux_data_socketcall *ax;
struct audit_context *context = current->audit_context;
- if (likely(!context || context->dummy))
+ if (likely(!context))
return 0;
ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL);
@@ -1743,7 +1708,7 @@ int audit_sockaddr(int len, void *a)
struct audit_aux_data_sockaddr *ax;
struct audit_context *context = current->audit_context;
- if (likely(!context || context->dummy))
+ if (likely(!context))
return 0;
ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL);
diff --git a/trunk/kernel/delayacct.c b/trunk/kernel/delayacct.c
index 57ca3730205d..f05392d64267 100644
--- a/trunk/kernel/delayacct.c
+++ b/trunk/kernel/delayacct.c
@@ -19,15 +19,15 @@
#include
#include
-int delayacct_on __read_mostly = 1; /* Delay accounting turned on/off */
+int delayacct_on __read_mostly; /* Delay accounting turned on/off */
kmem_cache_t *delayacct_cache;
-static int __init delayacct_setup_disable(char *str)
+static int __init delayacct_setup_enable(char *str)
{
- delayacct_on = 0;
+ delayacct_on = 1;
return 1;
}
-__setup("nodelayacct", delayacct_setup_disable);
+__setup("delayacct", delayacct_setup_enable);
void delayacct_init(void)
{
diff --git a/trunk/kernel/futex.c b/trunk/kernel/futex.c
index dda2049692a2..cf0c8e21d1ab 100644
--- a/trunk/kernel/futex.c
+++ b/trunk/kernel/futex.c
@@ -415,15 +415,15 @@ static struct task_struct * futex_find_get_task(pid_t pid)
*/
void exit_pi_state_list(struct task_struct *curr)
{
+ struct futex_hash_bucket *hb;
struct list_head *next, *head = &curr->pi_state_list;
struct futex_pi_state *pi_state;
- struct futex_hash_bucket *hb;
union futex_key key;
/*
* We are a ZOMBIE and nobody can enqueue itself on
* pi_state_list anymore, but we have to be careful
- * versus waiters unqueueing themselves:
+ * versus waiters unqueueing themselfs
*/
spin_lock_irq(&curr->pi_lock);
while (!list_empty(head)) {
@@ -431,24 +431,21 @@ void exit_pi_state_list(struct task_struct *curr)
next = head->next;
pi_state = list_entry(next, struct futex_pi_state, list);
key = pi_state->key;
- hb = hash_futex(&key);
spin_unlock_irq(&curr->pi_lock);
+ hb = hash_futex(&key);
spin_lock(&hb->lock);
spin_lock_irq(&curr->pi_lock);
- /*
- * We dropped the pi-lock, so re-check whether this
- * task still owns the PI-state:
- */
if (head->next != next) {
spin_unlock(&hb->lock);
continue;
}
- WARN_ON(pi_state->owner != curr);
- WARN_ON(list_empty(&pi_state->list));
list_del_init(&pi_state->list);
+
+ WARN_ON(pi_state->owner != curr);
+
pi_state->owner = NULL;
spin_unlock_irq(&curr->pi_lock);
@@ -473,7 +470,7 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me)
head = &hb->chain;
list_for_each_entry_safe(this, next, head, list) {
- if (match_futex(&this->key, &me->key)) {
+ if (match_futex (&this->key, &me->key)) {
/*
* Another waiter already exists - bump up
* the refcount and return its pi_state:
@@ -485,8 +482,6 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me)
if (unlikely(!pi_state))
return -EINVAL;
- WARN_ON(!atomic_read(&pi_state->refcount));
-
atomic_inc(&pi_state->refcount);
me->pi_state = pi_state;
@@ -495,13 +490,10 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me)
}
/*
- * We are the first waiter - try to look up the real owner and attach
- * the new pi_state to it, but bail out when the owner died bit is set
- * and TID = 0:
+ * We are the first waiter - try to look up the real owner and
+ * attach the new pi_state to it:
*/
pid = uval & FUTEX_TID_MASK;
- if (!pid && (uval & FUTEX_OWNER_DIED))
- return -ESRCH;
p = futex_find_get_task(pid);
if (!p)
return -ESRCH;
@@ -518,7 +510,6 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, struct futex_q *me)
pi_state->key = me->key;
spin_lock_irq(&p->pi_lock);
- WARN_ON(!list_empty(&pi_state->list));
list_add(&pi_state->list, &p->pi_state_list);
pi_state->owner = p;
spin_unlock_irq(&p->pi_lock);
@@ -582,29 +573,20 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
* kept enabled while there is PI state around. We must also
* preserve the owner died bit.)
*/
- if (!(uval & FUTEX_OWNER_DIED)) {
- newval = FUTEX_WAITERS | new_owner->pid;
+ newval = (uval & FUTEX_OWNER_DIED) | FUTEX_WAITERS | new_owner->pid;
- inc_preempt_count();
- curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
- dec_preempt_count();
- if (curval == -EFAULT)
- return -EFAULT;
- if (curval != uval)
- return -EINVAL;
- }
+ inc_preempt_count();
+ curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
+ dec_preempt_count();
- spin_lock_irq(&pi_state->owner->pi_lock);
- WARN_ON(list_empty(&pi_state->list));
- list_del_init(&pi_state->list);
- spin_unlock_irq(&pi_state->owner->pi_lock);
+ if (curval == -EFAULT)
+ return -EFAULT;
+ if (curval != uval)
+ return -EINVAL;
- spin_lock_irq(&new_owner->pi_lock);
- WARN_ON(!list_empty(&pi_state->list));
+ list_del_init(&pi_state->owner->pi_state_list);
list_add(&pi_state->list, &new_owner->pi_state_list);
pi_state->owner = new_owner;
- spin_unlock_irq(&new_owner->pi_lock);
-
rt_mutex_unlock(&pi_state->pi_mutex);
return 0;
@@ -1254,7 +1236,6 @@ static int do_futex_lock_pi(u32 __user *uaddr, int detect, int trylock,
/* Owner died? */
if (q.pi_state->owner != NULL) {
spin_lock_irq(&q.pi_state->owner->pi_lock);
- WARN_ON(list_empty(&q.pi_state->list));
list_del_init(&q.pi_state->list);
spin_unlock_irq(&q.pi_state->owner->pi_lock);
} else
@@ -1263,7 +1244,6 @@ static int do_futex_lock_pi(u32 __user *uaddr, int detect, int trylock,
q.pi_state->owner = current;
spin_lock_irq(¤t->pi_lock);
- WARN_ON(!list_empty(&q.pi_state->list));
list_add(&q.pi_state->list, ¤t->pi_state_list);
spin_unlock_irq(¤t->pi_lock);
@@ -1447,11 +1427,9 @@ static int futex_unlock_pi(u32 __user *uaddr)
* again. If it succeeds then we can return without waking
* anyone else up:
*/
- if (!(uval & FUTEX_OWNER_DIED)) {
- inc_preempt_count();
- uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0);
- dec_preempt_count();
- }
+ inc_preempt_count();
+ uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0);
+ dec_preempt_count();
if (unlikely(uval == -EFAULT))
goto pi_faulted;
@@ -1484,11 +1462,9 @@ static int futex_unlock_pi(u32 __user *uaddr)
/*
* No waiters - kernel unlocks the futex:
*/
- if (!(uval & FUTEX_OWNER_DIED)) {
- ret = unlock_futex_pi(uaddr, uval);
- if (ret == -EFAULT)
- goto pi_faulted;
- }
+ ret = unlock_futex_pi(uaddr, uval);
+ if (ret == -EFAULT)
+ goto pi_faulted;
out_unlock:
spin_unlock(&hb->lock);
@@ -1707,9 +1683,9 @@ sys_get_robust_list(int pid, struct robust_list_head __user **head_ptr,
* Process a futex-list entry, check whether it's owned by the
* dying task, and do notification if so:
*/
-int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi)
+int handle_futex_death(u32 __user *uaddr, struct task_struct *curr)
{
- u32 uval, nval, mval;
+ u32 uval, nval;
retry:
if (get_user(uval, uaddr))
@@ -1726,44 +1702,20 @@ int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi)
* thread-death.) The rest of the cleanup is done in
* userspace.
*/
- mval = (uval & FUTEX_WAITERS) | FUTEX_OWNER_DIED;
- nval = futex_atomic_cmpxchg_inatomic(uaddr, uval, mval);
-
+ nval = futex_atomic_cmpxchg_inatomic(uaddr, uval,
+ uval | FUTEX_OWNER_DIED);
if (nval == -EFAULT)
return -1;
if (nval != uval)
goto retry;
- /*
- * Wake robust non-PI futexes here. The wakeup of
- * PI futexes happens in exit_pi_state():
- */
- if (!pi) {
- if (uval & FUTEX_WAITERS)
- futex_wake(uaddr, 1);
- }
+ if (uval & FUTEX_WAITERS)
+ futex_wake(uaddr, 1);
}
return 0;
}
-/*
- * Fetch a robust-list pointer. Bit 0 signals PI futexes:
- */
-static inline int fetch_robust_entry(struct robust_list __user **entry,
- struct robust_list __user **head, int *pi)
-{
- unsigned long uentry;
-
- if (get_user(uentry, (unsigned long *)head))
- return -EFAULT;
-
- *entry = (void *)(uentry & ~1UL);
- *pi = uentry & 1;
-
- return 0;
-}
-
/*
* Walk curr->robust_list (very carefully, it's a userspace list!)
* and mark any locks found there dead, and notify any waiters.
@@ -1774,14 +1726,14 @@ void exit_robust_list(struct task_struct *curr)
{
struct robust_list_head __user *head = curr->robust_list;
struct robust_list __user *entry, *pending;
- unsigned int limit = ROBUST_LIST_LIMIT, pi, pip;
+ unsigned int limit = ROBUST_LIST_LIMIT;
unsigned long futex_offset;
/*
* Fetch the list head (which was registered earlier, via
* sys_set_robust_list()):
*/
- if (fetch_robust_entry(&entry, &head->list.next, &pi))
+ if (get_user(entry, &head->list.next))
return;
/*
* Fetch the relative futex offset:
@@ -1792,11 +1744,10 @@ void exit_robust_list(struct task_struct *curr)
* Fetch any possibly pending lock-add first, and handle it
* if it exists:
*/
- if (fetch_robust_entry(&pending, &head->list_op_pending, &pip))
+ if (get_user(pending, &head->list_op_pending))
return;
-
if (pending)
- handle_futex_death((void *)pending + futex_offset, curr, pip);
+ handle_futex_death((void *)pending + futex_offset, curr);
while (entry != &head->list) {
/*
@@ -1805,12 +1756,12 @@ void exit_robust_list(struct task_struct *curr)
*/
if (entry != pending)
if (handle_futex_death((void *)entry + futex_offset,
- curr, pi))
+ curr))
return;
/*
* Fetch the next entry in the list:
*/
- if (fetch_robust_entry(&entry, &entry->next, &pi))
+ if (get_user(entry, &entry->next))
return;
/*
* Avoid excessively long or circular lists:
diff --git a/trunk/kernel/futex_compat.c b/trunk/kernel/futex_compat.c
index d1aab1a452cc..d1d92b441fb7 100644
--- a/trunk/kernel/futex_compat.c
+++ b/trunk/kernel/futex_compat.c
@@ -12,23 +12,6 @@
#include
-
-/*
- * Fetch a robust-list pointer. Bit 0 signals PI futexes:
- */
-static inline int
-fetch_robust_entry(compat_uptr_t *uentry, struct robust_list __user **entry,
- compat_uptr_t *head, int *pi)
-{
- if (get_user(*uentry, head))
- return -EFAULT;
-
- *entry = compat_ptr((*uentry) & ~1);
- *pi = (unsigned int)(*uentry) & 1;
-
- return 0;
-}
-
/*
* Walk curr->robust_list (very carefully, it's a userspace list!)
* and mark any locks found there dead, and notify any waiters.
@@ -39,16 +22,17 @@ void compat_exit_robust_list(struct task_struct *curr)
{
struct compat_robust_list_head __user *head = curr->compat_robust_list;
struct robust_list __user *entry, *pending;
- unsigned int limit = ROBUST_LIST_LIMIT, pi;
compat_uptr_t uentry, upending;
+ unsigned int limit = ROBUST_LIST_LIMIT;
compat_long_t futex_offset;
/*
* Fetch the list head (which was registered earlier, via
* sys_set_robust_list()):
*/
- if (fetch_robust_entry(&uentry, &entry, &head->list.next, &pi))
+ if (get_user(uentry, &head->list.next))
return;
+ entry = compat_ptr(uentry);
/*
* Fetch the relative futex offset:
*/
@@ -58,11 +42,11 @@ void compat_exit_robust_list(struct task_struct *curr)
* Fetch any possibly pending lock-add first, and handle it
* if it exists:
*/
- if (fetch_robust_entry(&upending, &pending,
- &head->list_op_pending, &pi))
+ if (get_user(upending, &head->list_op_pending))
return;
+ pending = compat_ptr(upending);
if (upending)
- handle_futex_death((void *)pending + futex_offset, curr, pi);
+ handle_futex_death((void *)pending + futex_offset, curr);
while (compat_ptr(uentry) != &head->list) {
/*
@@ -71,15 +55,15 @@ void compat_exit_robust_list(struct task_struct *curr)
*/
if (entry != pending)
if (handle_futex_death((void *)entry + futex_offset,
- curr, pi))
+ curr))
return;
/*
* Fetch the next entry in the list:
*/
- if (fetch_robust_entry(&uentry, &entry,
- (compat_uptr_t *)&entry->next, &pi))
+ if (get_user(uentry, (compat_uptr_t *)&entry->next))
return;
+ entry = compat_ptr(uentry);
/*
* Avoid excessively long or circular lists:
*/
diff --git a/trunk/kernel/hrtimer.c b/trunk/kernel/hrtimer.c
index be989efc7856..d17766d40dab 100644
--- a/trunk/kernel/hrtimer.c
+++ b/trunk/kernel/hrtimer.c
@@ -835,7 +835,7 @@ static void migrate_hrtimers(int cpu)
}
#endif /* CONFIG_HOTPLUG_CPU */
-static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self,
+static int __devinit hrtimer_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
@@ -859,7 +859,7 @@ static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self,
return NOTIFY_OK;
}
-static struct notifier_block __cpuinitdata hrtimers_nb = {
+static struct notifier_block __devinitdata hrtimers_nb = {
.notifier_call = hrtimer_cpu_notify,
};
diff --git a/trunk/kernel/irq/manage.c b/trunk/kernel/irq/manage.c
index 92be519eff26..4e461438e48b 100644
--- a/trunk/kernel/irq/manage.c
+++ b/trunk/kernel/irq/manage.c
@@ -137,40 +137,16 @@ EXPORT_SYMBOL(enable_irq);
* @irq: interrupt to control
* @on: enable/disable power management wakeup
*
- * Enable/disable power management wakeup mode, which is
- * disabled by default. Enables and disables must match,
- * just as they match for non-wakeup mode support.
- *
- * Wakeup mode lets this IRQ wake the system from sleep
- * states like "suspend to RAM".
+ * Enable/disable power management wakeup mode
*/
int set_irq_wake(unsigned int irq, unsigned int on)
{
struct irq_desc *desc = irq_desc + irq;
unsigned long flags;
int ret = -ENXIO;
- int (*set_wake)(unsigned, unsigned) = desc->chip->set_wake;
- /* wakeup-capable irqs can be shared between drivers that
- * don't need to have the same sleep mode behaviors.
- */
spin_lock_irqsave(&desc->lock, flags);
- if (on) {
- if (desc->wake_depth++ == 0)
- desc->status |= IRQ_WAKEUP;
- else
- set_wake = NULL;
- } else {
- if (desc->wake_depth == 0) {
- printk(KERN_WARNING "Unbalanced IRQ %d "
- "wake disable\n", irq);
- WARN_ON(1);
- } else if (--desc->wake_depth == 0)
- desc->status &= ~IRQ_WAKEUP;
- else
- set_wake = NULL;
- }
- if (set_wake)
+ if (desc->chip->set_wake)
ret = desc->chip->set_wake(irq, on);
spin_unlock_irqrestore(&desc->lock, flags);
return ret;
diff --git a/trunk/kernel/kprobes.c b/trunk/kernel/kprobes.c
index 3f57dfdc8f92..64aab081153b 100644
--- a/trunk/kernel/kprobes.c
+++ b/trunk/kernel/kprobes.c
@@ -393,7 +393,6 @@ static int __kprobes add_new_kprobe(struct kprobe *old_p, struct kprobe *p)
static inline void add_aggr_kprobe(struct kprobe *ap, struct kprobe *p)
{
copy_kprobe(p, ap);
- flush_insn_slot(ap);
ap->addr = p->addr;
ap->pre_handler = aggr_pre_handler;
ap->fault_handler = aggr_fault_handler;
diff --git a/trunk/kernel/rcupdate.c b/trunk/kernel/rcupdate.c
index 436ab35f6fa7..759805c9859a 100644
--- a/trunk/kernel/rcupdate.c
+++ b/trunk/kernel/rcupdate.c
@@ -548,7 +548,7 @@ static void __devinit rcu_online_cpu(int cpu)
tasklet_init(&per_cpu(rcu_tasklet, cpu), rcu_process_callbacks, 0UL);
}
-static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
+static int __devinit rcu_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
@@ -565,7 +565,7 @@ static int __cpuinit rcu_cpu_notify(struct notifier_block *self,
return NOTIFY_OK;
}
-static struct notifier_block __cpuinitdata rcu_nb = {
+static struct notifier_block __devinitdata rcu_nb = {
.notifier_call = rcu_cpu_notify,
};
diff --git a/trunk/kernel/rtmutex.c b/trunk/kernel/rtmutex.c
index 3e13a1e5856f..d2ef13b485e7 100644
--- a/trunk/kernel/rtmutex.c
+++ b/trunk/kernel/rtmutex.c
@@ -7,8 +7,6 @@
* Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner
* Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt
* Copyright (C) 2006 Esben Nielsen
- *
- * See Documentation/rt-mutex-design.txt for details.
*/
#include
#include
diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c
index a2be2d055299..b44b9a43b0fc 100644
--- a/trunk/kernel/sched.c
+++ b/trunk/kernel/sched.c
@@ -4456,9 +4456,9 @@ asmlinkage long sys_sched_yield(void)
return 0;
}
-static inline int __resched_legal(int expected_preempt_count)
+static inline int __resched_legal(void)
{
- if (unlikely(preempt_count() != expected_preempt_count))
+ if (unlikely(preempt_count()))
return 0;
if (unlikely(system_state != SYSTEM_RUNNING))
return 0;
@@ -4484,7 +4484,7 @@ static void __cond_resched(void)
int __sched cond_resched(void)
{
- if (need_resched() && __resched_legal(0)) {
+ if (need_resched() && __resched_legal()) {
__cond_resched();
return 1;
}
@@ -4510,7 +4510,7 @@ int cond_resched_lock(spinlock_t *lock)
ret = 1;
spin_lock(lock);
}
- if (need_resched() && __resched_legal(1)) {
+ if (need_resched() && __resched_legal()) {
spin_release(&lock->dep_map, 1, _THIS_IP_);
_raw_spin_unlock(lock);
preempt_enable_no_resched();
@@ -4526,7 +4526,7 @@ int __sched cond_resched_softirq(void)
{
BUG_ON(!in_softirq());
- if (need_resched() && __resched_legal(0)) {
+ if (need_resched() && __resched_legal()) {
raw_local_irq_disable();
_local_bh_enable();
raw_local_irq_enable();
@@ -6494,12 +6494,7 @@ static int build_sched_domains(const cpumask_t *cpu_map)
for (i = 0; i < MAX_NUMNODES; i++)
init_numa_sched_groups_power(sched_group_nodes[i]);
- if (sched_group_allnodes) {
- int group = cpu_to_allnodes_group(first_cpu(*cpu_map));
- struct sched_group *sg = &sched_group_allnodes[group];
-
- init_numa_sched_groups_power(sg);
- }
+ init_numa_sched_groups_power(sched_group_allnodes);
#endif
/* Attach the domains */
@@ -6766,11 +6761,6 @@ void __init sched_init(void)
}
set_load_weight(&init_task);
-
-#ifdef CONFIG_RT_MUTEXES
- plist_head_init(&init_task.pi_waiters, &init_task.pi_lock);
-#endif
-
/*
* The boot idle thread does lazy MMU switching as well:
*/
diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c
index bfdb5686fa3e..7fe874d12fae 100644
--- a/trunk/kernel/signal.c
+++ b/trunk/kernel/signal.c
@@ -791,31 +791,22 @@ specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
/*
* Force a signal that the process can't ignore: if necessary
* we unblock the signal and change any SIG_IGN to SIG_DFL.
- *
- * Note: If we unblock the signal, we always reset it to SIG_DFL,
- * since we do not want to have a signal handler that was blocked
- * be invoked when user space had explicitly blocked it.
- *
- * We don't want to have recursive SIGSEGV's etc, for example.
*/
+
int
force_sig_info(int sig, struct siginfo *info, struct task_struct *t)
{
unsigned long int flags;
- int ret, blocked, ignored;
- struct k_sigaction *action;
+ int ret;
spin_lock_irqsave(&t->sighand->siglock, flags);
- action = &t->sighand->action[sig-1];
- ignored = action->sa.sa_handler == SIG_IGN;
- blocked = sigismember(&t->blocked, sig);
- if (blocked || ignored) {
- action->sa.sa_handler = SIG_DFL;
- if (blocked) {
- sigdelset(&t->blocked, sig);
- recalc_sigpending_tsk(t);
- }
+ if (t->sighand->action[sig-1].sa.sa_handler == SIG_IGN) {
+ t->sighand->action[sig-1].sa.sa_handler = SIG_DFL;
+ }
+ if (sigismember(&t->blocked, sig)) {
+ sigdelset(&t->blocked, sig);
}
+ recalc_sigpending_tsk(t);
ret = specific_send_sig_info(sig, info, t);
spin_unlock_irqrestore(&t->sighand->siglock, flags);
diff --git a/trunk/kernel/softirq.c b/trunk/kernel/softirq.c
index 3789ca98197c..0f08a84ae307 100644
--- a/trunk/kernel/softirq.c
+++ b/trunk/kernel/softirq.c
@@ -65,7 +65,6 @@ static inline void wakeup_softirqd(void)
* This one is for softirq.c-internal use,
* where hardirqs are disabled legitimately:
*/
-#ifdef CONFIG_TRACE_IRQFLAGS
static void __local_bh_disable(unsigned long ip)
{
unsigned long flags;
@@ -81,13 +80,6 @@ static void __local_bh_disable(unsigned long ip)
trace_softirqs_off(ip);
raw_local_irq_restore(flags);
}
-#else /* !CONFIG_TRACE_IRQFLAGS */
-static inline void __local_bh_disable(unsigned long ip)
-{
- add_preempt_count(SOFTIRQ_OFFSET);
- barrier();
-}
-#endif /* CONFIG_TRACE_IRQFLAGS */
void local_bh_disable(void)
{
@@ -129,16 +121,12 @@ EXPORT_SYMBOL(_local_bh_enable);
void local_bh_enable(void)
{
-#ifdef CONFIG_TRACE_IRQFLAGS
unsigned long flags;
WARN_ON_ONCE(in_irq());
-#endif
WARN_ON_ONCE(irqs_disabled());
-#ifdef CONFIG_TRACE_IRQFLAGS
local_irq_save(flags);
-#endif
/*
* Are softirqs going to be turned on now:
*/
@@ -154,22 +142,18 @@ void local_bh_enable(void)
do_softirq();
dec_preempt_count();
-#ifdef CONFIG_TRACE_IRQFLAGS
local_irq_restore(flags);
-#endif
preempt_check_resched();
}
EXPORT_SYMBOL(local_bh_enable);
void local_bh_enable_ip(unsigned long ip)
{
-#ifdef CONFIG_TRACE_IRQFLAGS
unsigned long flags;
WARN_ON_ONCE(in_irq());
local_irq_save(flags);
-#endif
/*
* Are softirqs going to be turned on now:
*/
@@ -185,9 +169,7 @@ void local_bh_enable_ip(unsigned long ip)
do_softirq();
dec_preempt_count();
-#ifdef CONFIG_TRACE_IRQFLAGS
local_irq_restore(flags);
-#endif
preempt_check_resched();
}
EXPORT_SYMBOL(local_bh_enable_ip);
@@ -565,7 +547,7 @@ static void takeover_tasklets(unsigned int cpu)
}
#endif /* CONFIG_HOTPLUG_CPU */
-static int __cpuinit cpu_callback(struct notifier_block *nfb,
+static int __devinit cpu_callback(struct notifier_block *nfb,
unsigned long action,
void *hcpu)
{
@@ -605,7 +587,7 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb,
return NOTIFY_OK;
}
-static struct notifier_block __cpuinitdata cpu_nfb = {
+static struct notifier_block __devinitdata cpu_nfb = {
.notifier_call = cpu_callback
};
diff --git a/trunk/kernel/softlockup.c b/trunk/kernel/softlockup.c
index 03e6a2b0b787..6b76caa22981 100644
--- a/trunk/kernel/softlockup.c
+++ b/trunk/kernel/softlockup.c
@@ -104,7 +104,7 @@ static int watchdog(void * __bind_cpu)
/*
* Create/destroy watchdog threads as CPUs come and go:
*/
-static int __cpuinit
+static int __devinit
cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
{
int hotcpu = (unsigned long)hcpu;
@@ -142,7 +142,7 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
return NOTIFY_OK;
}
-static struct notifier_block __cpuinitdata cpu_nfb = {
+static struct notifier_block __devinitdata cpu_nfb = {
.notifier_call = cpu_callback
};
diff --git a/trunk/kernel/taskstats.c b/trunk/kernel/taskstats.c
index e78187657330..f45179ce028e 100644
--- a/trunk/kernel/taskstats.c
+++ b/trunk/kernel/taskstats.c
@@ -121,45 +121,46 @@ static int send_reply(struct sk_buff *skb, pid_t pid)
/*
* Send taskstats data in @skb to listeners registered for @cpu's exit data
*/
-static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu)
+static int send_cpu_listeners(struct sk_buff *skb, unsigned int cpu)
{
struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data);
struct listener_list *listeners;
struct listener *s, *tmp;
struct sk_buff *skb_next, *skb_cur = skb;
void *reply = genlmsg_data(genlhdr);
- int rc, delcount = 0;
+ int rc, ret, delcount = 0;
rc = genlmsg_end(skb, reply);
if (rc < 0) {
nlmsg_free(skb);
- return;
+ return rc;
}
rc = 0;
listeners = &per_cpu(listener_array, cpu);
down_read(&listeners->sem);
- list_for_each_entry(s, &listeners->list, list) {
+ list_for_each_entry_safe(s, tmp, &listeners->list, list) {
skb_next = NULL;
if (!list_is_last(&s->list, &listeners->list)) {
skb_next = skb_clone(skb_cur, GFP_KERNEL);
- if (!skb_next)
+ if (!skb_next) {
+ nlmsg_free(skb_cur);
+ rc = -ENOMEM;
break;
+ }
}
- rc = genlmsg_unicast(skb_cur, s->pid);
- if (rc == -ECONNREFUSED) {
+ ret = genlmsg_unicast(skb_cur, s->pid);
+ if (ret == -ECONNREFUSED) {
s->valid = 0;
delcount++;
+ rc = ret;
}
skb_cur = skb_next;
}
up_read(&listeners->sem);
- if (skb_cur)
- nlmsg_free(skb_cur);
-
if (!delcount)
- return;
+ return rc;
/* Delete invalidated entries */
down_write(&listeners->sem);
@@ -170,12 +171,13 @@ static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu)
}
}
up_write(&listeners->sem);
+ return rc;
}
static int fill_pid(pid_t pid, struct task_struct *pidtsk,
struct taskstats *stats)
{
- int rc = 0;
+ int rc;
struct task_struct *tsk = pidtsk;
if (!pidtsk) {
@@ -194,10 +196,12 @@ static int fill_pid(pid_t pid, struct task_struct *pidtsk,
* Each accounting subsystem adds calls to its functions to
* fill in relevant parts of struct taskstsats as follows
*
- * per-task-foo(stats, tsk);
+ * rc = per-task-foo(stats, tsk);
+ * if (rc)
+ * goto err;
*/
- delayacct_add_tsk(stats, tsk);
+ rc = delayacct_add_tsk(stats, tsk);
stats->version = TASKSTATS_VERSION;
/* Define err: label here if needed */
diff --git a/trunk/kernel/timer.c b/trunk/kernel/timer.c
index b650f04888ed..05809c2e2fd6 100644
--- a/trunk/kernel/timer.c
+++ b/trunk/kernel/timer.c
@@ -84,7 +84,7 @@ typedef struct tvec_t_base_s tvec_base_t;
tvec_base_t boot_tvec_bases;
EXPORT_SYMBOL(boot_tvec_bases);
-static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = &boot_tvec_bases;
+static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = { &boot_tvec_bases };
static inline void set_running_timer(tvec_base_t *base,
struct timer_list *timer)
@@ -408,7 +408,7 @@ static int cascade(tvec_base_t *base, tvec_t *tv, int index)
* This function cascades all vectors and executes all expired timer
* vectors.
*/
-#define INDEX(N) ((base->timer_jiffies >> (TVR_BITS + (N) * TVN_BITS)) & TVN_MASK)
+#define INDEX(N) (base->timer_jiffies >> (TVR_BITS + N * TVN_BITS)) & TVN_MASK
static inline void __run_timers(tvec_base_t *base)
{
@@ -1688,7 +1688,7 @@ static void __devinit migrate_timers(int cpu)
}
#endif /* CONFIG_HOTPLUG_CPU */
-static int __cpuinit timer_cpu_notify(struct notifier_block *self,
+static int __devinit timer_cpu_notify(struct notifier_block *self,
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
@@ -1708,7 +1708,7 @@ static int __cpuinit timer_cpu_notify(struct notifier_block *self,
return NOTIFY_OK;
}
-static struct notifier_block __cpuinitdata timers_nb = {
+static struct notifier_block __devinitdata timers_nb = {
.notifier_call = timer_cpu_notify,
};
diff --git a/trunk/kernel/workqueue.c b/trunk/kernel/workqueue.c
index 448e8f7b342d..eebb1d839235 100644
--- a/trunk/kernel/workqueue.c
+++ b/trunk/kernel/workqueue.c
@@ -93,12 +93,9 @@ static void __queue_work(struct cpu_workqueue_struct *cwq,
spin_unlock_irqrestore(&cwq->lock, flags);
}
-/**
- * queue_work - queue work on a workqueue
- * @wq: workqueue to use
- * @work: work to queue
- *
- * Returns non-zero if it was successfully added.
+/*
+ * Queue work on a workqueue. Return non-zero if it was successfully
+ * added.
*
* We queue the work to the CPU it was submitted, but there is no
* guarantee that it will be processed by that CPU.
@@ -131,14 +128,6 @@ static void delayed_work_timer_fn(unsigned long __data)
__queue_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
}
-/**
- * queue_delayed_work - queue work on a workqueue after delay
- * @wq: workqueue to use
- * @work: work to queue
- * @delay: number of jiffies to wait before queueing
- *
- * Returns non-zero if it was successfully added.
- */
int fastcall queue_delayed_work(struct workqueue_struct *wq,
struct work_struct *work, unsigned long delay)
{
@@ -161,15 +150,6 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq,
}
EXPORT_SYMBOL_GPL(queue_delayed_work);
-/**
- * queue_delayed_work_on - queue work on specific CPU after delay
- * @cpu: CPU number to execute work on
- * @wq: workqueue to use
- * @work: work to queue
- * @delay: number of jiffies to wait before queueing
- *
- * Returns non-zero if it was successfully added.
- */
int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
struct work_struct *work, unsigned long delay)
{
@@ -295,9 +275,8 @@ static void flush_cpu_workqueue(struct cpu_workqueue_struct *cwq)
}
}
-/**
+/*
* flush_workqueue - ensure that any scheduled work has run to completion.
- * @wq: workqueue to flush
*
* Forces execution of the workqueue and blocks until its completion.
* This is typically used in driver shutdown handlers.
@@ -421,12 +400,6 @@ static void cleanup_workqueue_thread(struct workqueue_struct *wq, int cpu)
kthread_stop(p);
}
-/**
- * destroy_workqueue - safely terminate a workqueue
- * @wq: target workqueue
- *
- * Safely destroy a workqueue. All work currently pending will be done first.
- */
void destroy_workqueue(struct workqueue_struct *wq)
{
int cpu;
@@ -452,41 +425,18 @@ EXPORT_SYMBOL_GPL(destroy_workqueue);
static struct workqueue_struct *keventd_wq;
-/**
- * schedule_work - put work task in global workqueue
- * @work: job to be done
- *
- * This puts a job in the kernel-global workqueue.
- */
int fastcall schedule_work(struct work_struct *work)
{
return queue_work(keventd_wq, work);
}
EXPORT_SYMBOL(schedule_work);
-/**
- * schedule_delayed_work - put work task in global workqueue after delay
- * @work: job to be done
- * @delay: number of jiffies to wait
- *
- * After waiting for a given time this puts a job in the kernel-global
- * workqueue.
- */
int fastcall schedule_delayed_work(struct work_struct *work, unsigned long delay)
{
return queue_delayed_work(keventd_wq, work, delay);
}
EXPORT_SYMBOL(schedule_delayed_work);
-/**
- * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
- * @cpu: cpu to use
- * @work: job to be done
- * @delay: number of jiffies to wait
- *
- * After waiting for a given time this puts a job in the kernel-global
- * workqueue on the specified CPU.
- */
int schedule_delayed_work_on(int cpu,
struct work_struct *work, unsigned long delay)
{
diff --git a/trunk/lib/zlib_inflate/inflate.c b/trunk/lib/zlib_inflate/inflate.c
index fceb97c3aff7..7f922dccf1a5 100644
--- a/trunk/lib/zlib_inflate/inflate.c
+++ b/trunk/lib/zlib_inflate/inflate.c
@@ -347,10 +347,7 @@ int zlib_inflate(z_streamp strm, int flush)
static const unsigned short order[19] = /* permutation of code lengths */
{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
- /* Do not check for strm->next_out == NULL here as ppc zImage
- inflates to strm->next_out = 0 */
-
- if (strm == NULL || strm->state == NULL ||
+ if (strm == NULL || strm->state == NULL || strm->next_out == NULL ||
(strm->next_in == NULL && strm->avail_in != 0))
return Z_STREAM_ERROR;
diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c
index b9a60c43b61a..d087fc3d3281 100644
--- a/trunk/mm/filemap.c
+++ b/trunk/mm/filemap.c
@@ -849,6 +849,8 @@ static void shrink_readahead_size_eio(struct file *filp,
return;
ra->ra_pages /= 4;
+ printk(KERN_WARNING "Reducing readahead size to %luK\n",
+ ra->ra_pages << (PAGE_CACHE_SHIFT - 10));
}
/**
diff --git a/trunk/mm/slab.c b/trunk/mm/slab.c
index 21ba06035700..0f20843beffd 100644
--- a/trunk/mm/slab.c
+++ b/trunk/mm/slab.c
@@ -1106,7 +1106,7 @@ static inline int cache_free_alien(struct kmem_cache *cachep, void *objp)
#endif
-static int __cpuinit cpuup_callback(struct notifier_block *nfb,
+static int __devinit cpuup_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
long cpu = (long)hcpu;
@@ -3224,7 +3224,7 @@ void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
EXPORT_SYMBOL(kmem_cache_alloc);
/**
- * kmem_cache_zalloc - Allocate an object. The memory is set to zero.
+ * kmem_cache_alloc - Allocate an object. The memory is set to zero.
* @cache: The cache to allocate from.
* @flags: See kmalloc().
*
diff --git a/trunk/net/core/Makefile b/trunk/net/core/Makefile
index 2645ba428d48..e9bd2467d5a9 100644
--- a/trunk/net/core/Makefile
+++ b/trunk/net/core/Makefile
@@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \
obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
-obj-y += dev.o ethtool.o dev_mcast.o dst.o netevent.o \
+obj-y += dev.o ethtool.o dev_mcast.o dst.o \
neighbour.o rtnetlink.o utils.o link_watch.o filter.o
obj-$(CONFIG_XFRM) += flow.o
diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c
index d95e2626d944..4d2b5167d7f5 100644
--- a/trunk/net/core/dev.c
+++ b/trunk/net/core/dev.c
@@ -1166,6 +1166,11 @@ int skb_checksum_help(struct sk_buff *skb, int inward)
goto out_set_summed;
if (unlikely(skb_shinfo(skb)->gso_size)) {
+ static int warned;
+
+ WARN_ON(!warned);
+ warned = 1;
+
/* Let GSO fix up the checksum. */
goto out_set_summed;
}
@@ -1215,6 +1220,11 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
__skb_pull(skb, skb->mac_len);
if (unlikely(skb->ip_summed != CHECKSUM_HW)) {
+ static int warned;
+
+ WARN_ON(!warned);
+ warned = 1;
+
if (skb_header_cloned(skb) &&
(err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
return ERR_PTR(err);
@@ -3419,9 +3429,12 @@ static void net_dma_rebalance(void)
unsigned int cpu, i, n;
struct dma_chan *chan;
+ lock_cpu_hotplug();
+
if (net_dma_count == 0) {
for_each_online_cpu(cpu)
- rcu_assign_pointer(per_cpu(softnet_data, cpu).net_dma, NULL);
+ rcu_assign_pointer(per_cpu(softnet_data.net_dma, cpu), NULL);
+ unlock_cpu_hotplug();
return;
}
@@ -3434,13 +3447,15 @@ static void net_dma_rebalance(void)
+ (i < (num_online_cpus() % net_dma_count) ? 1 : 0));
while(n) {
- per_cpu(softnet_data, cpu).net_dma = chan;
+ per_cpu(softnet_data.net_dma, cpu) = chan;
cpu = next_cpu(cpu, cpu_online_map);
n--;
}
i++;
}
rcu_read_unlock();
+
+ unlock_cpu_hotplug();
}
/**
diff --git a/trunk/net/core/neighbour.c b/trunk/net/core/neighbour.c
index 5130d2efdbbe..7ad681f5e712 100644
--- a/trunk/net/core/neighbour.c
+++ b/trunk/net/core/neighbour.c
@@ -29,7 +29,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -755,7 +754,6 @@ static void neigh_timer_handler(unsigned long arg)
neigh->nud_state = NUD_STALE;
neigh->updated = jiffies;
neigh_suspect(neigh);
- notify = 1;
}
} else if (state & NUD_DELAY) {
if (time_before_eq(now,
@@ -764,7 +762,6 @@ static void neigh_timer_handler(unsigned long arg)
neigh->nud_state = NUD_REACHABLE;
neigh->updated = jiffies;
neigh_connect(neigh);
- notify = 1;
next = neigh->confirmed + neigh->parms->reachable_time;
} else {
NEIGH_PRINTK2("neigh %p is probed.\n", neigh);
@@ -822,8 +819,6 @@ static void neigh_timer_handler(unsigned long arg)
out:
write_unlock(&neigh->lock);
}
- if (notify)
- call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
#ifdef CONFIG_ARPD
if (notify && neigh->parms->app_probes)
@@ -931,7 +926,9 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
{
u8 old;
int err;
+#ifdef CONFIG_ARPD
int notify = 0;
+#endif
struct net_device *dev;
int update_isrouter = 0;
@@ -951,7 +948,9 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
neigh_suspect(neigh);
neigh->nud_state = new;
err = 0;
+#ifdef CONFIG_ARPD
notify = old & NUD_VALID;
+#endif
goto out;
}
@@ -1023,7 +1022,9 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
if (!(new & NUD_CONNECTED))
neigh->confirmed = jiffies -
(neigh->parms->base_reachable_time << 1);
+#ifdef CONFIG_ARPD
notify = 1;
+#endif
}
if (new == old)
goto out;
@@ -1055,9 +1056,6 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
(neigh->flags & ~NTF_ROUTER);
}
write_unlock_bh(&neigh->lock);
-
- if (notify)
- call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh);
#ifdef CONFIG_ARPD
if (notify && neigh->parms->app_probes)
neigh_app_notify(neigh);
diff --git a/trunk/net/core/netevent.c b/trunk/net/core/netevent.c
deleted file mode 100644
index 35d02c38554e..000000000000
--- a/trunk/net/core/netevent.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Network event notifiers
- *
- * Authors:
- * Tom Tucker
- * Steve Wise
- *
- * 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 Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- * Fixes:
- */
-
-#include
-#include
-
-static ATOMIC_NOTIFIER_HEAD(netevent_notif_chain);
-
-/**
- * register_netevent_notifier - register a netevent notifier block
- * @nb: notifier
- *
- * Register a notifier to be called when a netevent occurs.
- * The notifier passed is linked into the kernel structures and must
- * not be reused until it has been unregistered. A negative errno code
- * is returned on a failure.
- */
-int register_netevent_notifier(struct notifier_block *nb)
-{
- int err;
-
- err = atomic_notifier_chain_register(&netevent_notif_chain, nb);
- return err;
-}
-
-/**
- * netevent_unregister_notifier - unregister a netevent notifier block
- * @nb: notifier
- *
- * Unregister a notifier previously registered by
- * register_neigh_notifier(). The notifier is unlinked into the
- * kernel structures and may then be reused. A negative errno code
- * is returned on a failure.
- */
-
-int unregister_netevent_notifier(struct notifier_block *nb)
-{
- return atomic_notifier_chain_unregister(&netevent_notif_chain, nb);
-}
-
-/**
- * call_netevent_notifiers - call all netevent notifier blocks
- * @val: value passed unmodified to notifier function
- * @v: pointer passed unmodified to notifier function
- *
- * Call all neighbour notifier blocks. Parameters and return value
- * are as for notifier_call_chain().
- */
-
-int call_netevent_notifiers(unsigned long val, void *v)
-{
- return atomic_notifier_call_chain(&netevent_notif_chain, val, v);
-}
-
-EXPORT_SYMBOL_GPL(register_netevent_notifier);
-EXPORT_SYMBOL_GPL(unregister_netevent_notifier);
-EXPORT_SYMBOL_GPL(call_netevent_notifiers);
diff --git a/trunk/net/core/skbuff.c b/trunk/net/core/skbuff.c
index 022d8894c11d..476aa3978504 100644
--- a/trunk/net/core/skbuff.c
+++ b/trunk/net/core/skbuff.c
@@ -70,6 +70,13 @@
static kmem_cache_t *skbuff_head_cache __read_mostly;
static kmem_cache_t *skbuff_fclone_cache __read_mostly;
+/*
+ * lockdep: lock class key used by skb_queue_head_init():
+ */
+struct lock_class_key skb_queue_lock_key;
+
+EXPORT_SYMBOL(skb_queue_lock_key);
+
/*
* Keep out-of-line to prevent kernel bloat.
* __builtin_return_address is not used because it is not always
@@ -249,29 +256,6 @@ struct sk_buff *alloc_skb_from_cache(kmem_cache_t *cp,
goto out;
}
-/**
- * __netdev_alloc_skb - allocate an skbuff for rx on a specific device
- * @dev: network device to receive on
- * @length: length to allocate
- * @gfp_mask: get_free_pages mask, passed to alloc_skb
- *
- * Allocate a new &sk_buff and assign it a usage count of one. The
- * buffer has unspecified headroom built in. Users should allocate
- * the headroom they think they need without accounting for the
- * built in space. The built in space is used for optimisations.
- *
- * %NULL is returned if there is no free memory.
- */
-struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
- unsigned int length, gfp_t gfp_mask)
-{
- struct sk_buff *skb;
-
- skb = alloc_skb(length + NET_SKB_PAD, gfp_mask);
- if (likely(skb))
- skb_reserve(skb, NET_SKB_PAD);
- return skb;
-}
static void skb_drop_list(struct sk_buff **listp)
{
@@ -862,11 +846,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
unlikely((err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))))
return err;
- i = 0;
- if (offset >= len)
- goto drop_pages;
-
- for (; i < nfrags; i++) {
+ for (i = 0; i < nfrags; i++) {
int end = offset + skb_shinfo(skb)->frags[i].size;
if (end < len) {
@@ -874,9 +854,9 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
continue;
}
- skb_shinfo(skb)->frags[i++].size = len - offset;
+ if (len > offset)
+ skb_shinfo(skb)->frags[i++].size = len - offset;
-drop_pages:
skb_shinfo(skb)->nr_frags = i;
for (; i < nfrags; i++)
@@ -884,7 +864,7 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
if (skb_shinfo(skb)->frag_list)
skb_drop_fraglist(skb);
- goto done;
+ break;
}
for (fragp = &skb_shinfo(skb)->frag_list; (frag = *fragp);
@@ -899,7 +879,6 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
return -ENOMEM;
nfrag->next = frag->next;
- kfree_skb(frag);
frag = nfrag;
*fragp = frag;
}
@@ -918,7 +897,6 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len)
break;
}
-done:
if (len > skb_headlen(skb)) {
skb->data_len -= skb->len - len;
skb->len = len;
@@ -2064,7 +2042,6 @@ EXPORT_SYMBOL(__kfree_skb);
EXPORT_SYMBOL(kfree_skb);
EXPORT_SYMBOL(__pskb_pull_tail);
EXPORT_SYMBOL(__alloc_skb);
-EXPORT_SYMBOL(__netdev_alloc_skb);
EXPORT_SYMBOL(pskb_copy);
EXPORT_SYMBOL(pskb_expand_head);
EXPORT_SYMBOL(skb_checksum);
diff --git a/trunk/net/dccp/ipv6.c b/trunk/net/dccp/ipv6.c
index 610c722ac27f..9f3d4d7cd0bf 100644
--- a/trunk/net/dccp/ipv6.c
+++ b/trunk/net/dccp/ipv6.c
@@ -230,7 +230,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
ipv6_addr_copy(&np->saddr, saddr);
inet->rcv_saddr = LOOPBACK4_IPV6;
- __ip6_dst_store(sk, dst, NULL);
+ ip6_dst_store(sk, dst, NULL);
icsk->icsk_ext_hdr_len = 0;
if (np->opt != NULL)
@@ -863,7 +863,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
* comment in that function for the gory details. -acme
*/
- __ip6_dst_store(newsk, dst, NULL);
+ ip6_dst_store(newsk, dst, NULL);
newsk->sk_route_caps = dst->dev->features & ~(NETIF_F_IP_CSUM |
NETIF_F_TSO);
newdp6 = (struct dccp6_sock *)newsk;
diff --git a/trunk/net/decnet/dn_route.c b/trunk/net/decnet/dn_route.c
index 743e9fcf7c5a..1355614ec11b 100644
--- a/trunk/net/decnet/dn_route.c
+++ b/trunk/net/decnet/dn_route.c
@@ -925,13 +925,8 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
for(dev_out = dev_base; dev_out; dev_out = dev_out->next) {
if (!dev_out->dn_ptr)
continue;
- if (!dn_dev_islocal(dev_out, oldflp->fld_src))
- continue;
- if ((dev_out->flags & IFF_LOOPBACK) &&
- oldflp->fld_dst &&
- !dn_dev_islocal(dev_out, oldflp->fld_dst))
- continue;
- break;
+ if (dn_dev_islocal(dev_out, oldflp->fld_src))
+ break;
}
read_unlock(&dev_base_lock);
if (dev_out == NULL)
diff --git a/trunk/net/ipv4/ip_output.c b/trunk/net/ipv4/ip_output.c
index 9bf307a29783..7c9f9a6421b8 100644
--- a/trunk/net/ipv4/ip_output.c
+++ b/trunk/net/ipv4/ip_output.c
@@ -526,8 +526,6 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
err = output(skb);
- if (!err)
- IP_INC_STATS(IPSTATS_MIB_FRAGCREATES);
if (err || !frag)
break;
@@ -651,6 +649,9 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
/*
* Put this fragment into the sending queue.
*/
+
+ IP_INC_STATS(IPSTATS_MIB_FRAGCREATES);
+
iph->tot_len = htons(len + hlen);
ip_send_check(iph);
@@ -658,8 +659,6 @@ int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
err = output(skb2);
if (err)
goto fail;
-
- IP_INC_STATS(IPSTATS_MIB_FRAGCREATES);
}
kfree_skb(skb);
IP_INC_STATS(IPSTATS_MIB_FRAGOKS);
diff --git a/trunk/net/ipv4/ip_sockglue.c b/trunk/net/ipv4/ip_sockglue.c
index 2d05c4133d3e..84f43a3c9098 100644
--- a/trunk/net/ipv4/ip_sockglue.c
+++ b/trunk/net/ipv4/ip_sockglue.c
@@ -112,19 +112,14 @@ static void ip_cmsg_recv_retopts(struct msghdr *msg, struct sk_buff *skb)
static void ip_cmsg_recv_security(struct msghdr *msg, struct sk_buff *skb)
{
char *secdata;
- u32 seclen, secid;
+ u32 seclen;
int err;
- err = security_socket_getpeersec_dgram(NULL, skb, &secid);
- if (err)
- return;
-
- err = security_secid_to_secctx(secid, &secdata, &seclen);
+ err = security_socket_getpeersec_dgram(skb, &secdata, &seclen);
if (err)
return;
put_cmsg(msg, SOL_IP, SCM_SECURITY, seclen, secdata);
- security_release_secctx(secdata, seclen);
}
diff --git a/trunk/net/ipv4/netfilter/ip_conntrack_sip.c b/trunk/net/ipv4/netfilter/ip_conntrack_sip.c
index 4f222d6be009..fc87ce0da40d 100644
--- a/trunk/net/ipv4/netfilter/ip_conntrack_sip.c
+++ b/trunk/net/ipv4/netfilter/ip_conntrack_sip.c
@@ -442,7 +442,7 @@ static int __init init(void)
sip[i].tuple.src.u.udp.port = htons(ports[i]);
sip[i].mask.src.u.udp.port = 0xFFFF;
sip[i].mask.dst.protonum = 0xFF;
- sip[i].max_expected = 2;
+ sip[i].max_expected = 1;
sip[i].timeout = 3 * 60; /* 3 minutes */
sip[i].me = THIS_MODULE;
sip[i].help = sip_help;
diff --git a/trunk/net/ipv4/netfilter/ipt_hashlimit.c b/trunk/net/ipv4/netfilter/ipt_hashlimit.c
index 6b662449e825..92980ab8ce48 100644
--- a/trunk/net/ipv4/netfilter/ipt_hashlimit.c
+++ b/trunk/net/ipv4/netfilter/ipt_hashlimit.c
@@ -508,9 +508,6 @@ hashlimit_checkentry(const char *tablename,
if (!r->cfg.expire)
return 0;
- if (r->name[sizeof(r->name) - 1] != '\0')
- return 0;
-
/* This is the best we've got: We cannot release and re-grab lock,
* since checkentry() is called before ip_tables.c grabs ipt_mutex.
* We also cannot grab the hashtable spinlock, since htable_create will
diff --git a/trunk/net/ipv4/route.c b/trunk/net/ipv4/route.c
index 19bd49d69d9f..2dc6dbb28467 100644
--- a/trunk/net/ipv4/route.c
+++ b/trunk/net/ipv4/route.c
@@ -104,7 +104,6 @@
#include
#include
#include
-#include
#ifdef CONFIG_SYSCTL
#include
#endif
@@ -1126,7 +1125,6 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw,
struct rtable *rth, **rthp;
u32 skeys[2] = { saddr, 0 };
int ikeys[2] = { dev->ifindex, 0 };
- struct netevent_redirect netevent;
if (!in_dev)
return;
@@ -1218,11 +1216,6 @@ void ip_rt_redirect(u32 old_gw, u32 daddr, u32 new_gw,
rt_drop(rt);
goto do_next;
}
-
- netevent.old = &rth->u.dst;
- netevent.new = &rt->u.dst;
- call_netevent_notifiers(NETEVENT_REDIRECT,
- &netevent);
rt_del(hash, rth);
if (!rt_intern_hash(hash, rt, &rt))
@@ -1459,7 +1452,6 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
}
dst->metrics[RTAX_MTU-1] = mtu;
dst_set_expires(dst, ip_rt_mtu_expires);
- call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst);
}
}
diff --git a/trunk/net/ipv4/tcp.c b/trunk/net/ipv4/tcp.c
index 934396bb1376..f6a2d9223d07 100644
--- a/trunk/net/ipv4/tcp.c
+++ b/trunk/net/ipv4/tcp.c
@@ -1132,7 +1132,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
tp->ucopy.dma_chan = NULL;
preempt_disable();
if ((len > sysctl_tcp_dma_copybreak) && !(flags & MSG_PEEK) &&
- !sysctl_tcp_low_latency && __get_cpu_var(softnet_data).net_dma) {
+ !sysctl_tcp_low_latency && __get_cpu_var(softnet_data.net_dma)) {
preempt_enable_no_resched();
tp->ucopy.pinned_list = dma_pin_iovec_pages(msg->msg_iov, len);
} else
@@ -1659,8 +1659,7 @@ void tcp_close(struct sock *sk, long timeout)
const int tmo = tcp_fin_time(sk);
if (tmo > TCP_TIMEWAIT_LEN) {
- inet_csk_reset_keepalive_timer(sk,
- tmo - TCP_TIMEWAIT_LEN);
+ inet_csk_reset_keepalive_timer(sk, tcp_fin_time(sk));
} else {
tcp_time_wait(sk, TCP_FIN_WAIT2, tmo);
goto out;
diff --git a/trunk/net/ipv4/tcp_ipv4.c b/trunk/net/ipv4/tcp_ipv4.c
index 4b04c3edd4a9..f6f39e814291 100644
--- a/trunk/net/ipv4/tcp_ipv4.c
+++ b/trunk/net/ipv4/tcp_ipv4.c
@@ -438,6 +438,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info)
It can f.e. if SYNs crossed.
*/
if (!sock_owned_by_user(sk)) {
+ TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
sk->sk_err = err;
sk->sk_error_report(sk);
@@ -873,6 +874,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
drop_and_free:
reqsk_free(req);
drop:
+ TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
return 0;
}
diff --git a/trunk/net/ipv4/tcp_minisocks.c b/trunk/net/ipv4/tcp_minisocks.c
index 624e2b2c7f53..0ccb7cb22b15 100644
--- a/trunk/net/ipv4/tcp_minisocks.c
+++ b/trunk/net/ipv4/tcp_minisocks.c
@@ -589,10 +589,8 @@ struct sock *tcp_check_req(struct sock *sk,struct sk_buff *skb,
/* RFC793: "second check the RST bit" and
* "fourth, check the SYN bit"
*/
- if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN)) {
- TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
+ if (flg & (TCP_FLAG_RST|TCP_FLAG_SYN))
goto embryonic_reset;
- }
/* ACK sequence verified above, just make sure ACK is
* set. If ACK not set, just silently drop the packet.
diff --git a/trunk/net/ipv4/tcp_probe.c b/trunk/net/ipv4/tcp_probe.c
index b3435324b573..d7d517a3a238 100644
--- a/trunk/net/ipv4/tcp_probe.c
+++ b/trunk/net/ipv4/tcp_probe.c
@@ -114,7 +114,7 @@ static int tcpprobe_open(struct inode * inode, struct file * file)
static ssize_t tcpprobe_read(struct file *file, char __user *buf,
size_t len, loff_t *ppos)
{
- int error = 0, cnt = 0;
+ int error = 0, cnt;
unsigned char *tbuf;
if (!buf || len < 0)
diff --git a/trunk/net/ipv6/addrconf.c b/trunk/net/ipv6/addrconf.c
index 8ea1e36bf8eb..2316a4315a18 100644
--- a/trunk/net/ipv6/addrconf.c
+++ b/trunk/net/ipv6/addrconf.c
@@ -1869,21 +1869,15 @@ int addrconf_set_dstaddr(void __user *arg)
/*
* Manual configuration of address on an interface
*/
-static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen,
- __u32 prefered_lft, __u32 valid_lft)
+static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen)
{
struct inet6_ifaddr *ifp;
struct inet6_dev *idev;
struct net_device *dev;
- __u8 ifa_flags = 0;
int scope;
ASSERT_RTNL();
- /* check the lifetime */
- if (!valid_lft || prefered_lft > valid_lft)
- return -EINVAL;
-
if ((dev = __dev_get_by_index(ifindex)) == NULL)
return -ENODEV;
@@ -1895,29 +1889,10 @@ static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen,
scope = ipv6_addr_scope(pfx);
- if (valid_lft == INFINITY_LIFE_TIME)
- ifa_flags |= IFA_F_PERMANENT;
- else if (valid_lft >= 0x7FFFFFFF/HZ)
- valid_lft = 0x7FFFFFFF/HZ;
-
- if (prefered_lft == 0)
- ifa_flags |= IFA_F_DEPRECATED;
- else if ((prefered_lft >= 0x7FFFFFFF/HZ) &&
- (prefered_lft != INFINITY_LIFE_TIME))
- prefered_lft = 0x7FFFFFFF/HZ;
-
- ifp = ipv6_add_addr(idev, pfx, plen, scope, ifa_flags);
-
+ ifp = ipv6_add_addr(idev, pfx, plen, scope, IFA_F_PERMANENT);
if (!IS_ERR(ifp)) {
- spin_lock(&ifp->lock);
- ifp->valid_lft = valid_lft;
- ifp->prefered_lft = prefered_lft;
- ifp->tstamp = jiffies;
- spin_unlock(&ifp->lock);
-
addrconf_dad_start(ifp, 0);
in6_ifa_put(ifp);
- addrconf_verify(0);
return 0;
}
@@ -1970,8 +1945,7 @@ int addrconf_add_ifaddr(void __user *arg)
return -EFAULT;
rtnl_lock();
- err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen,
- INFINITY_LIFE_TIME, INFINITY_LIFE_TIME);
+ err = inet6_addr_add(ireq.ifr6_ifindex, &ireq.ifr6_addr, ireq.ifr6_prefixlen);
rtnl_unlock();
return err;
}
@@ -2797,16 +2771,12 @@ static void addrconf_verify(unsigned long foo)
ifp->idev->nd_parms->retrans_time / HZ;
#endif
- if (ifp->valid_lft != INFINITY_LIFE_TIME &&
- age >= ifp->valid_lft) {
+ if (age >= ifp->valid_lft) {
spin_unlock(&ifp->lock);
in6_ifa_hold(ifp);
read_unlock(&addrconf_hash_lock);
ipv6_del_addr(ifp);
goto restart;
- } else if (ifp->prefered_lft == INFINITY_LIFE_TIME) {
- spin_unlock(&ifp->lock);
- continue;
} else if (age >= ifp->prefered_lft) {
/* jiffies - ifp->tsamp > age >= ifp->prefered_lft */
int deprecate = 0;
@@ -2883,8 +2853,7 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
pfx = RTA_DATA(rta[IFA_ADDRESS-1]);
}
if (rta[IFA_LOCAL-1]) {
- if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) ||
- (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))))
+ if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))
return -EINVAL;
pfx = RTA_DATA(rta[IFA_LOCAL-1]);
}
@@ -2894,62 +2863,12 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
return inet6_addr_del(ifm->ifa_index, pfx, ifm->ifa_prefixlen);
}
-static int
-inet6_addr_modify(int ifindex, struct in6_addr *pfx,
- __u32 prefered_lft, __u32 valid_lft)
-{
- struct inet6_ifaddr *ifp = NULL;
- struct net_device *dev;
- int ifa_flags = 0;
-
- if ((dev = __dev_get_by_index(ifindex)) == NULL)
- return -ENODEV;
-
- if (!(dev->flags&IFF_UP))
- return -ENETDOWN;
-
- if (!valid_lft || (prefered_lft > valid_lft))
- return -EINVAL;
-
- ifp = ipv6_get_ifaddr(pfx, dev, 1);
- if (ifp == NULL)
- return -ENOENT;
-
- if (valid_lft == INFINITY_LIFE_TIME)
- ifa_flags = IFA_F_PERMANENT;
- else if (valid_lft >= 0x7FFFFFFF/HZ)
- valid_lft = 0x7FFFFFFF/HZ;
-
- if (prefered_lft == 0)
- ifa_flags = IFA_F_DEPRECATED;
- else if ((prefered_lft >= 0x7FFFFFFF/HZ) &&
- (prefered_lft != INFINITY_LIFE_TIME))
- prefered_lft = 0x7FFFFFFF/HZ;
-
- spin_lock_bh(&ifp->lock);
- ifp->flags = (ifp->flags & ~(IFA_F_DEPRECATED|IFA_F_PERMANENT)) | ifa_flags;
-
- ifp->tstamp = jiffies;
- ifp->valid_lft = valid_lft;
- ifp->prefered_lft = prefered_lft;
-
- spin_unlock_bh(&ifp->lock);
- if (!(ifp->flags&IFA_F_TENTATIVE))
- ipv6_ifa_notify(0, ifp);
- in6_ifa_put(ifp);
-
- addrconf_verify(0);
-
- return 0;
-}
-
static int
inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
{
struct rtattr **rta = arg;
struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
struct in6_addr *pfx;
- __u32 valid_lft = INFINITY_LIFE_TIME, prefered_lft = INFINITY_LIFE_TIME;
pfx = NULL;
if (rta[IFA_ADDRESS-1]) {
@@ -2958,34 +2877,14 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
pfx = RTA_DATA(rta[IFA_ADDRESS-1]);
}
if (rta[IFA_LOCAL-1]) {
- if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*pfx) ||
- (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx))))
+ if (pfx && memcmp(pfx, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*pfx)))
return -EINVAL;
pfx = RTA_DATA(rta[IFA_LOCAL-1]);
}
if (pfx == NULL)
return -EINVAL;
- if (rta[IFA_CACHEINFO-1]) {
- struct ifa_cacheinfo *ci;
- if (RTA_PAYLOAD(rta[IFA_CACHEINFO-1]) < sizeof(*ci))
- return -EINVAL;
- ci = RTA_DATA(rta[IFA_CACHEINFO-1]);
- valid_lft = ci->ifa_valid;
- prefered_lft = ci->ifa_prefered;
- }
-
- if (nlh->nlmsg_flags & NLM_F_REPLACE) {
- int ret;
- ret = inet6_addr_modify(ifm->ifa_index, pfx,
- prefered_lft, valid_lft);
- if (ret == 0 || !(nlh->nlmsg_flags & NLM_F_CREATE))
- return ret;
- }
-
- return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen,
- prefered_lft, valid_lft);
-
+ return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen);
}
/* Maximum length of ifa_cacheinfo attributes */
@@ -3222,62 +3121,6 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)
return inet6_dump_addr(skb, cb, type);
}
-static int inet6_rtm_getaddr(struct sk_buff *in_skb,
- struct nlmsghdr* nlh, void *arg)
-{
- struct rtattr **rta = arg;
- struct ifaddrmsg *ifm = NLMSG_DATA(nlh);
- struct in6_addr *addr = NULL;
- struct net_device *dev = NULL;
- struct inet6_ifaddr *ifa;
- struct sk_buff *skb;
- int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + INET6_IFADDR_RTA_SPACE);
- int err;
-
- if (rta[IFA_ADDRESS-1]) {
- if (RTA_PAYLOAD(rta[IFA_ADDRESS-1]) < sizeof(*addr))
- return -EINVAL;
- addr = RTA_DATA(rta[IFA_ADDRESS-1]);
- }
- if (rta[IFA_LOCAL-1]) {
- if (RTA_PAYLOAD(rta[IFA_LOCAL-1]) < sizeof(*addr) ||
- (addr && memcmp(addr, RTA_DATA(rta[IFA_LOCAL-1]), sizeof(*addr))))
- return -EINVAL;
- addr = RTA_DATA(rta[IFA_LOCAL-1]);
- }
- if (addr == NULL)
- return -EINVAL;
-
- if (ifm->ifa_index)
- dev = __dev_get_by_index(ifm->ifa_index);
-
- if ((ifa = ipv6_get_ifaddr(addr, dev, 1)) == NULL)
- return -EADDRNOTAVAIL;
-
- if ((skb = alloc_skb(size, GFP_KERNEL)) == NULL) {
- err = -ENOBUFS;
- goto out;
- }
-
- NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid;
- err = inet6_fill_ifaddr(skb, ifa, NETLINK_CB(in_skb).pid,
- nlh->nlmsg_seq, RTM_NEWADDR, 0);
- if (err < 0) {
- err = -EMSGSIZE;
- goto out_free;
- }
-
- err = netlink_unicast(rtnl, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT);
- if (err > 0)
- err = 0;
-out:
- in6_ifa_put(ifa);
- return err;
-out_free:
- kfree_skb(skb);
- goto out;
-}
-
static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)
{
struct sk_buff *skb;
@@ -3520,8 +3363,7 @@ static struct rtnetlink_link inet6_rtnetlink_table[RTM_NR_MSGTYPES] = {
[RTM_GETLINK - RTM_BASE] = { .dumpit = inet6_dump_ifinfo, },
[RTM_NEWADDR - RTM_BASE] = { .doit = inet6_rtm_newaddr, },
[RTM_DELADDR - RTM_BASE] = { .doit = inet6_rtm_deladdr, },
- [RTM_GETADDR - RTM_BASE] = { .doit = inet6_rtm_getaddr,
- .dumpit = inet6_dump_ifaddr, },
+ [RTM_GETADDR - RTM_BASE] = { .dumpit = inet6_dump_ifaddr, },
[RTM_GETMULTICAST - RTM_BASE] = { .dumpit = inet6_dump_ifmcaddr, },
[RTM_GETANYCAST - RTM_BASE] = { .dumpit = inet6_dump_ifacaddr, },
[RTM_NEWROUTE - RTM_BASE] = { .doit = inet6_rtm_newroute, },
diff --git a/trunk/net/ipv6/af_inet6.c b/trunk/net/ipv6/af_inet6.c
index ac85e9c532c2..5a0ba58b86cc 100644
--- a/trunk/net/ipv6/af_inet6.c
+++ b/trunk/net/ipv6/af_inet6.c
@@ -658,7 +658,7 @@ int inet6_sk_rebuild_header(struct sock *sk)
return err;
}
- __ip6_dst_store(sk, dst, NULL);
+ ip6_dst_store(sk, dst, NULL);
}
return 0;
diff --git a/trunk/net/ipv6/inet6_connection_sock.c b/trunk/net/ipv6/inet6_connection_sock.c
index bf491077b822..5c950cc79d80 100644
--- a/trunk/net/ipv6/inet6_connection_sock.c
+++ b/trunk/net/ipv6/inet6_connection_sock.c
@@ -185,7 +185,7 @@ int inet6_csk_xmit(struct sk_buff *skb, int ipfragok)
return err;
}
- __ip6_dst_store(sk, dst, NULL);
+ ip6_dst_store(sk, dst, NULL);
}
skb->dst = dst_clone(dst);
diff --git a/trunk/net/ipv6/ip6_output.c b/trunk/net/ipv6/ip6_output.c
index 69451af6abe7..3bc74ce78800 100644
--- a/trunk/net/ipv6/ip6_output.c
+++ b/trunk/net/ipv6/ip6_output.c
@@ -356,7 +356,6 @@ int ip6_forward(struct sk_buff *skb)
skb->dev = dst->dev;
icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
0, skb->dev);
- IP6_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
kfree_skb(skb);
return -ETIMEDOUT;
@@ -596,9 +595,6 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
}
err = output(skb);
- if(!err)
- IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES);
-
if (err || !frag)
break;
@@ -710,11 +706,12 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
/*
* Put this fragment into the sending queue.
*/
+
+ IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES);
+
err = output(frag);
if (err)
goto fail;
-
- IP6_INC_STATS(IPSTATS_MIB_FRAGCREATES);
}
kfree_skb(skb);
IP6_INC_STATS(IPSTATS_MIB_FRAGOKS);
@@ -726,51 +723,48 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
return err;
}
-static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
- struct dst_entry *dst,
- struct flowi *fl)
+int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
{
- struct ipv6_pinfo *np = inet6_sk(sk);
- struct rt6_info *rt = (struct rt6_info *)dst;
-
- if (!dst)
- goto out;
+ int err = 0;
- /* Yes, checking route validity in not connected
- * case is not very simple. Take into account,
- * that we do not support routing by source, TOS,
- * and MSG_DONTROUTE --ANK (980726)
- *
- * 1. If route was host route, check that
- * cached destination is current.
- * If it is network route, we still may
- * check its validity using saved pointer
- * to the last used address: daddr_cache.
- * We do not want to save whole address now,
- * (because main consumer of this service
- * is tcp, which has not this problem),
- * so that the last trick works only on connected
- * sockets.
- * 2. oif also should be the same.
- */
- if (((rt->rt6i_dst.plen != 128 ||
- !ipv6_addr_equal(&fl->fl6_dst, &rt->rt6i_dst.addr))
- && (np->daddr_cache == NULL ||
- !ipv6_addr_equal(&fl->fl6_dst, np->daddr_cache)))
- || (fl->oif && fl->oif != dst->dev->ifindex)) {
- dst_release(dst);
- dst = NULL;
+ *dst = NULL;
+ if (sk) {
+ struct ipv6_pinfo *np = inet6_sk(sk);
+
+ *dst = sk_dst_check(sk, np->dst_cookie);
+ if (*dst) {
+ struct rt6_info *rt = (struct rt6_info*)*dst;
+
+ /* Yes, checking route validity in not connected
+ * case is not very simple. Take into account,
+ * that we do not support routing by source, TOS,
+ * and MSG_DONTROUTE --ANK (980726)
+ *
+ * 1. If route was host route, check that
+ * cached destination is current.
+ * If it is network route, we still may
+ * check its validity using saved pointer
+ * to the last used address: daddr_cache.
+ * We do not want to save whole address now,
+ * (because main consumer of this service
+ * is tcp, which has not this problem),
+ * so that the last trick works only on connected
+ * sockets.
+ * 2. oif also should be the same.
+ */
+ if (((rt->rt6i_dst.plen != 128 ||
+ !ipv6_addr_equal(&fl->fl6_dst,
+ &rt->rt6i_dst.addr))
+ && (np->daddr_cache == NULL ||
+ !ipv6_addr_equal(&fl->fl6_dst,
+ np->daddr_cache)))
+ || (fl->oif && fl->oif != (*dst)->dev->ifindex)) {
+ dst_release(*dst);
+ *dst = NULL;
+ }
+ }
}
-out:
- return dst;
-}
-
-static int ip6_dst_lookup_tail(struct sock *sk,
- struct dst_entry **dst, struct flowi *fl)
-{
- int err;
-
if (*dst == NULL)
*dst = ip6_route_output(sk, fl);
@@ -779,6 +773,7 @@ static int ip6_dst_lookup_tail(struct sock *sk,
if (ipv6_addr_any(&fl->fl6_src)) {
err = ipv6_get_saddr(*dst, &fl->fl6_dst, &fl->fl6_src);
+
if (err)
goto out_err_release;
}
@@ -791,48 +786,8 @@ static int ip6_dst_lookup_tail(struct sock *sk,
return err;
}
-/**
- * ip6_dst_lookup - perform route lookup on flow
- * @sk: socket which provides route info
- * @dst: pointer to dst_entry * for result
- * @fl: flow to lookup
- *
- * This function performs a route lookup on the given flow.
- *
- * It returns zero on success, or a standard errno code on error.
- */
-int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
-{
- *dst = NULL;
- return ip6_dst_lookup_tail(sk, dst, fl);
-}
EXPORT_SYMBOL_GPL(ip6_dst_lookup);
-/**
- * ip6_sk_dst_lookup - perform socket cached route lookup on flow
- * @sk: socket which provides the dst cache and route info
- * @dst: pointer to dst_entry * for result
- * @fl: flow to lookup
- *
- * This function performs a route lookup on the given flow with the
- * possibility of using the cached route in the socket if it is valid.
- * It will take the socket dst lock when operating on the dst cache.
- * As a result, this function can only be used in process context.
- *
- * It returns zero on success, or a standard errno code on error.
- */
-int ip6_sk_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
-{
- *dst = NULL;
- if (sk) {
- *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
- *dst = ip6_sk_dst_check(sk, *dst, fl);
- }
-
- return ip6_dst_lookup_tail(sk, dst, fl);
-}
-EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup);
-
static inline int ip6_ufo_append_data(struct sock *sk,
int getfrag(void *from, char *to, int offset, int len,
int odd, struct sk_buff *skb),
diff --git a/trunk/net/ipv6/route.c b/trunk/net/ipv6/route.c
index 4b163711f3a8..87c39c978cd0 100644
--- a/trunk/net/ipv6/route.c
+++ b/trunk/net/ipv6/route.c
@@ -53,7 +53,6 @@
#include
#include
#include
-#include
#include
@@ -743,7 +742,6 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
dst->metrics[RTAX_FEATURES-1] |= RTAX_FEATURE_ALLFRAG;
}
dst->metrics[RTAX_MTU-1] = mtu;
- call_netevent_notifiers(NETEVENT_PMTU_UPDATE, dst);
}
}
@@ -1157,7 +1155,6 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *saddr,
struct rt6_info *rt, *nrt = NULL;
int strict;
struct fib6_node *fn;
- struct netevent_redirect netevent;
/*
* Get the "current" route for this destination and
@@ -1255,10 +1252,6 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *saddr,
if (ip6_ins_rt(nrt, NULL, NULL, NULL))
goto out;
- netevent.old = &rt->u.dst;
- netevent.new = &nrt->u.dst;
- call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
-
if (rt->rt6i_flags&RTF_CACHE) {
ip6_del_rt(rt, NULL, NULL, NULL);
return;
diff --git a/trunk/net/ipv6/tcp_ipv6.c b/trunk/net/ipv6/tcp_ipv6.c
index b843a650be71..923989d0520d 100644
--- a/trunk/net/ipv6/tcp_ipv6.c
+++ b/trunk/net/ipv6/tcp_ipv6.c
@@ -270,7 +270,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
inet->rcv_saddr = LOOPBACK4_IPV6;
sk->sk_gso_type = SKB_GSO_TCPV6;
- __ip6_dst_store(sk, dst, NULL);
+ ip6_dst_store(sk, dst, NULL);
icsk->icsk_ext_hdr_len = 0;
if (np->opt)
@@ -427,6 +427,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
case TCP_SYN_RECV: /* Cannot happen.
It can, it SYNs are crossed. --ANK */
if (!sock_owned_by_user(sk)) {
+ TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
sk->sk_err = err;
sk->sk_error_report(sk); /* Wake people up to see the error (see connect in sock.c) */
@@ -830,6 +831,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
if (req)
reqsk_free(req);
+ TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS);
return 0; /* don't send reset */
}
@@ -945,7 +947,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
*/
sk->sk_gso_type = SKB_GSO_TCPV6;
- __ip6_dst_store(newsk, dst, NULL);
+ ip6_dst_store(newsk, dst, NULL);
newtcp6sk = (struct tcp6_sock *)newsk;
inet_sk(newsk)->pinet6 = &newtcp6sk->inet6;
diff --git a/trunk/net/ipv6/udp.c b/trunk/net/ipv6/udp.c
index 3d54f246411e..ccc57f434cd3 100644
--- a/trunk/net/ipv6/udp.c
+++ b/trunk/net/ipv6/udp.c
@@ -782,7 +782,7 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
connected = 0;
}
- err = ip6_sk_dst_lookup(sk, &dst, fl);
+ err = ip6_dst_lookup(sk, &dst, fl);
if (err)
goto out;
if (final_p)
diff --git a/trunk/net/ipv6/xfrm6_output.c b/trunk/net/ipv6/xfrm6_output.c
index c8c8b44a0f58..0eea60ea9ebc 100644
--- a/trunk/net/ipv6/xfrm6_output.c
+++ b/trunk/net/ipv6/xfrm6_output.c
@@ -125,7 +125,7 @@ static int xfrm6_output_finish(struct sk_buff *skb)
if (!skb_is_gso(skb))
return xfrm6_output_finish2(skb);
- skb->protocol = htons(ETH_P_IPV6);
+ skb->protocol = htons(ETH_P_IP);
segs = skb_gso_segment(skb, 0);
kfree_skb(skb);
if (unlikely(IS_ERR(segs)))
diff --git a/trunk/net/netfilter/xt_SECMARK.c b/trunk/net/netfilter/xt_SECMARK.c
index de9537ad9a7c..c2ce9c4011cc 100644
--- a/trunk/net/netfilter/xt_SECMARK.c
+++ b/trunk/net/netfilter/xt_SECMARK.c
@@ -57,8 +57,6 @@ static int checkentry_selinux(struct xt_secmark_target_info *info)
{
int err;
struct xt_secmark_target_selinux_info *sel = &info->u.sel;
-
- sel->selctx[SECMARK_SELCTX_MAX - 1] = '\0';
err = selinux_string_to_sid(sel->selctx, &sel->selsid);
if (err) {
diff --git a/trunk/net/netfilter/xt_string.c b/trunk/net/netfilter/xt_string.c
index d8e3891b5f8b..0ebb6ac2c8c7 100644
--- a/trunk/net/netfilter/xt_string.c
+++ b/trunk/net/netfilter/xt_string.c
@@ -55,10 +55,7 @@ static int checkentry(const char *tablename,
/* Damn, can't handle this case properly with iptables... */
if (conf->from_offset > conf->to_offset)
return 0;
- if (conf->algo[XT_STRING_MAX_ALGO_NAME_SIZE - 1] != '\0')
- return 0;
- if (conf->patlen > XT_STRING_MAX_PATTERN_SIZE)
- return 0;
+
ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen,
GFP_KERNEL, TS_AUTOLOAD);
if (IS_ERR(ts_conf))
diff --git a/trunk/net/unix/af_unix.c b/trunk/net/unix/af_unix.c
index de6ec519272e..6f2909279268 100644
--- a/trunk/net/unix/af_unix.c
+++ b/trunk/net/unix/af_unix.c
@@ -128,17 +128,23 @@ static atomic_t unix_nr_socks = ATOMIC_INIT(0);
#define UNIX_ABSTRACT(sk) (unix_sk(sk)->addr->hash != UNIX_HASH_SIZE)
#ifdef CONFIG_SECURITY_NETWORK
-static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
+static void unix_get_peersec_dgram(struct sk_buff *skb)
{
- memcpy(UNIXSID(skb), &scm->secid, sizeof(u32));
+ int err;
+
+ err = security_socket_getpeersec_dgram(skb, UNIXSECDATA(skb),
+ UNIXSECLEN(skb));
+ if (err)
+ *(UNIXSECDATA(skb)) = NULL;
}
static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
{
- scm->secid = *UNIXSID(skb);
+ scm->secdata = *UNIXSECDATA(skb);
+ scm->seclen = *UNIXSECLEN(skb);
}
#else
-static inline void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
+static inline void unix_get_peersec_dgram(struct sk_buff *skb)
{ }
static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)
@@ -1316,7 +1322,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
if (siocb->scm->fp)
unix_attach_fds(siocb->scm, skb);
- unix_get_secdata(siocb->scm, skb);
+
+ unix_get_peersec_dgram(skb);
skb->h.raw = skb->data;
err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
diff --git a/trunk/scripts/Kbuild.include b/trunk/scripts/Kbuild.include
index bb19c1561f1e..2180c88cfe89 100644
--- a/trunk/scripts/Kbuild.include
+++ b/trunk/scripts/Kbuild.include
@@ -77,20 +77,14 @@ cc-option-align = $(subst -functions=0,,\
# cc-version
# Usage gcc-ver := $(call cc-version, $(CC))
-cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
+cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh \
+ $(if $(1), $(1), $(CC)))
# cc-ifversion
# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
cc-ifversion = $(shell if [ $(call cc-version, $(CC)) $(1) $(2) ]; then \
echo $(3); fi;)
-# ld-option
-# Usage: ldflags += $(call ld-option, -Wl$(comma)--hash-style=both)
-ld-option = $(shell if $(CC) $(1) \
- -nostdlib -o ldtest$$$$.out -xc /dev/null \
- > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi; \
- rm -f ldtest$$$$.out)
-
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
diff --git a/trunk/scripts/Makefile.modpost b/trunk/scripts/Makefile.modpost
index 0a64688c2b5d..a49550205dcc 100644
--- a/trunk/scripts/Makefile.modpost
+++ b/trunk/scripts/Makefile.modpost
@@ -40,7 +40,7 @@ include scripts/Kbuild.include
include scripts/Makefile.lib
kernelsymfile := $(objtree)/Module.symvers
-modulesymfile := $(KBUILD_EXTMOD)/Module.symvers
+modulesymfile := $(KBUILD_EXTMOD)/Modules.symvers
# Step 1), find all modules listed in $(MODVERDIR)/
__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
diff --git a/trunk/scripts/kconfig/confdata.c b/trunk/scripts/kconfig/confdata.c
index a69d8acbf274..2ee48c377b66 100644
--- a/trunk/scripts/kconfig/confdata.c
+++ b/trunk/scripts/kconfig/confdata.c
@@ -357,7 +357,7 @@ int conf_read(const char *name)
for (e = prop->expr; e; e = e->left.expr)
if (e->right.sym->visible != no)
flags &= e->right.sym->flags;
- sym->flags &= flags | ~SYMBOL_DEF_USER;
+ sym->flags |= flags & SYMBOL_DEF_USER;
}
sym_change_count += conf_warnings || conf_unsaved;
diff --git a/trunk/scripts/kernel-doc b/trunk/scripts/kernel-doc
index c9ca0c23bd91..f9460a6218de 100755
--- a/trunk/scripts/kernel-doc
+++ b/trunk/scripts/kernel-doc
@@ -1518,7 +1518,6 @@ sub dump_function($$) {
$prototype =~ s/^asmlinkage +//;
$prototype =~ s/^inline +//;
$prototype =~ s/^__inline__ +//;
- $prototype =~ s/__devinit +//;
$prototype =~ s/^#define +//; #ak added
$prototype =~ s/__attribute__ \(\([a-z,]*\)\)//;
diff --git a/trunk/scripts/mod/file2alias.c b/trunk/scripts/mod/file2alias.c
index 44312926b849..37f67c23e11b 100644
--- a/trunk/scripts/mod/file2alias.c
+++ b/trunk/scripts/mod/file2alias.c
@@ -52,23 +52,6 @@ do { \
sprintf(str + strlen(str), "*"); \
} while(0)
-/**
- * Check that sizeof(device_id type) are consistent with size of section
- * in .o file. If in-consistent then userspace and kernel does not agree
- * on actual size which is a bug.
- **/
-static void device_id_size_check(const char *modname, const char *device_id,
- unsigned long size, unsigned long id_size)
-{
- if (size % id_size || size < id_size) {
- fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo "
- "of the size of section __mod_%s_device_table=%lu.\n"
- "Fix definition of struct %s_device_id "
- "in mod_devicetable.h\n",
- modname, device_id, id_size, device_id, size, device_id);
- }
-}
-
/* USB is special because the bcdDevice can be matched against a numeric range */
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
static void do_usb_entry(struct usb_device_id *id,
@@ -169,8 +152,10 @@ static void do_usb_table(void *symval, unsigned long size,
unsigned int i;
const unsigned long id_size = sizeof(struct usb_device_id);
- device_id_size_check(mod->name, "usb", size, id_size);
-
+ if (size % id_size || size < id_size) {
+ warn("%s ids %lu bad size "
+ "(each on %lu)\n", mod->name, size, id_size);
+ }
/* Leave last one: it's the terminator. */
size -= id_size;
@@ -449,7 +434,6 @@ static inline int sym_is(const char *symbol, const char *name)
static void do_table(void *symval, unsigned long size,
unsigned long id_size,
- const char *device_id,
void *function,
struct module *mod)
{
@@ -457,7 +441,10 @@ static void do_table(void *symval, unsigned long size,
char alias[500];
int (*do_entry)(const char *, void *entry, char *alias) = function;
- device_id_size_check(mod->name, device_id, size, id_size);
+ if (size % id_size || size < id_size) {
+ warn("%s ids %lu bad size "
+ "(each on %lu)\n", mod->name, size, id_size);
+ }
/* Leave last one: it's the terminator. */
size -= id_size;
@@ -489,51 +476,40 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
+ sym->st_value;
if (sym_is(symname, "__mod_pci_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct pci_device_id), "pci",
+ do_table(symval, sym->st_size, sizeof(struct pci_device_id),
do_pci_entry, mod);
else if (sym_is(symname, "__mod_usb_device_table"))
/* special case to handle bcdDevice ranges */
do_usb_table(symval, sym->st_size, mod);
else if (sym_is(symname, "__mod_ieee1394_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct ieee1394_device_id), "ieee1394",
+ do_table(symval, sym->st_size, sizeof(struct ieee1394_device_id),
do_ieee1394_entry, mod);
else if (sym_is(symname, "__mod_ccw_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct ccw_device_id), "ccw",
+ do_table(symval, sym->st_size, sizeof(struct ccw_device_id),
do_ccw_entry, mod);
else if (sym_is(symname, "__mod_serio_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct serio_device_id), "serio",
+ do_table(symval, sym->st_size, sizeof(struct serio_device_id),
do_serio_entry, mod);
else if (sym_is(symname, "__mod_pnp_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct pnp_device_id), "pnp",
+ do_table(symval, sym->st_size, sizeof(struct pnp_device_id),
do_pnp_entry, mod);
else if (sym_is(symname, "__mod_pnp_card_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct pnp_card_device_id), "pnp_card",
+ do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id),
do_pnp_card_entry, mod);
else if (sym_is(symname, "__mod_pcmcia_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct pcmcia_device_id), "pcmcia",
+ do_table(symval, sym->st_size, sizeof(struct pcmcia_device_id),
do_pcmcia_entry, mod);
else if (sym_is(symname, "__mod_of_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct of_device_id), "of",
+ do_table(symval, sym->st_size, sizeof(struct of_device_id),
do_of_entry, mod);
else if (sym_is(symname, "__mod_vio_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct vio_device_id), "vio",
+ do_table(symval, sym->st_size, sizeof(struct vio_device_id),
do_vio_entry, mod);
else if (sym_is(symname, "__mod_i2c_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct i2c_device_id), "i2c",
+ do_table(symval, sym->st_size, sizeof(struct i2c_device_id),
do_i2c_entry, mod);
else if (sym_is(symname, "__mod_input_device_table"))
- do_table(symval, sym->st_size,
- sizeof(struct input_device_id), "input",
+ do_table(symval, sym->st_size, sizeof(struct input_device_id),
do_input_entry, mod);
}
diff --git a/trunk/security/dummy.c b/trunk/security/dummy.c
index 58c6d399c844..bbbfda70e131 100644
--- a/trunk/security/dummy.c
+++ b/trunk/security/dummy.c
@@ -791,7 +791,8 @@ static int dummy_socket_getpeersec_stream(struct socket *sock, char __user *optv
return -ENOPROTOOPT;
}
-static int dummy_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+static int dummy_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata,
+ u32 *seclen)
{
return -ENOPROTOOPT;
}
@@ -875,15 +876,6 @@ static int dummy_setprocattr(struct task_struct *p, char *name, void *value, siz
return -EINVAL;
}
-static int dummy_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
-{
- return -EOPNOTSUPP;
-}
-
-static void dummy_release_secctx(char *secdata, u32 seclen)
-{
-}
-
#ifdef CONFIG_KEYS
static inline int dummy_key_alloc(struct key *key, struct task_struct *ctx,
unsigned long flags)
@@ -1036,8 +1028,6 @@ void security_fixup_ops (struct security_operations *ops)
set_to_dummy_if_null(ops, d_instantiate);
set_to_dummy_if_null(ops, getprocattr);
set_to_dummy_if_null(ops, setprocattr);
- set_to_dummy_if_null(ops, secid_to_secctx);
- set_to_dummy_if_null(ops, release_secctx);
#ifdef CONFIG_SECURITY_NETWORK
set_to_dummy_if_null(ops, unix_stream_connect);
set_to_dummy_if_null(ops, unix_may_send);
diff --git a/trunk/security/selinux/hooks.c b/trunk/security/selinux/hooks.c
index 5d1b8c733199..a91c961ba38b 100644
--- a/trunk/security/selinux/hooks.c
+++ b/trunk/security/selinux/hooks.c
@@ -3524,21 +3524,25 @@ static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *op
return err;
}
-static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
+static int selinux_socket_getpeersec_dgram(struct sk_buff *skb, char **secdata, u32 *seclen)
{
- u32 peer_secid = SECSID_NULL;
int err = 0;
+ u32 peer_sid;
- if (sock && (sock->sk->sk_family == PF_UNIX))
- selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid);
- else if (skb)
- peer_secid = selinux_socket_getpeer_dgram(skb);
+ if (skb->sk->sk_family == PF_UNIX)
+ selinux_get_inode_sid(SOCK_INODE(skb->sk->sk_socket),
+ &peer_sid);
+ else
+ peer_sid = selinux_socket_getpeer_dgram(skb);
- if (peer_secid == SECSID_NULL)
- err = -EINVAL;
- *secid = peer_secid;
+ if (peer_sid == SECSID_NULL)
+ return -EINVAL;
- return err;
+ err = security_sid_to_context(peer_sid, secdata, seclen);
+ if (err)
+ return err;
+
+ return 0;
}
static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
@@ -4403,17 +4407,6 @@ static int selinux_setprocattr(struct task_struct *p,
return size;
}
-static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
-{
- return security_sid_to_context(secid, secdata, seclen);
-}
-
-static void selinux_release_secctx(char *secdata, u32 seclen)
-{
- if (secdata)
- kfree(secdata);
-}
-
#ifdef CONFIG_KEYS
static int selinux_key_alloc(struct key *k, struct task_struct *tsk,
@@ -4594,9 +4587,6 @@ static struct security_operations selinux_ops = {
.getprocattr = selinux_getprocattr,
.setprocattr = selinux_setprocattr,
- .secid_to_secctx = selinux_secid_to_secctx,
- .release_secctx = selinux_release_secctx,
-
.unix_stream_connect = selinux_socket_unix_stream_connect,
.unix_may_send = selinux_socket_unix_may_send,
diff --git a/trunk/security/selinux/ss/policydb.c b/trunk/security/selinux/ss/policydb.c
index f03960e697ce..0111990ba837 100644
--- a/trunk/security/selinux/ss/policydb.c
+++ b/trunk/security/selinux/ss/policydb.c
@@ -644,18 +644,10 @@ void policydb_destroy(struct policydb *p)
kfree(lra);
for (rt = p->range_tr; rt; rt = rt -> next) {
- if (lrt) {
- ebitmap_destroy(&lrt->range.level[0].cat);
- ebitmap_destroy(&lrt->range.level[1].cat);
- kfree(lrt);
- }
- lrt = rt;
- }
- if (lrt) {
- ebitmap_destroy(&lrt->range.level[0].cat);
- ebitmap_destroy(&lrt->range.level[1].cat);
kfree(lrt);
+ lrt = rt;
}
+ kfree(lrt);
if (p->type_attr_map) {
for (i = 0; i < p->p_types.nprim; i++)
diff --git a/trunk/security/selinux/ss/services.c b/trunk/security/selinux/ss/services.c
index 85e429884393..d2e80e62ff0c 100644
--- a/trunk/security/selinux/ss/services.c
+++ b/trunk/security/selinux/ss/services.c
@@ -833,8 +833,6 @@ static int security_compute_sid(u32 ssid,
goto out;
}
- context_init(&newcontext);
-
POLICY_RDLOCK;
scontext = sidtab_search(&sidtab, ssid);
@@ -852,6 +850,8 @@ static int security_compute_sid(u32 ssid,
goto out_unlock;
}
+ context_init(&newcontext);
+
/* Set the user identity. */
switch (specified) {
case AVTAB_TRANSITION: