[SCSI] Merge up to linux-2.6 head

Conflicts:

	drivers/scsi/jazz_esp.c

Same changes made by both SCSI and SPARC trees: problem with UTF-8
conversion in the copyright.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Цей коміт міститься в:
James Bottomley
2007-05-30 23:57:05 -05:00
джерело 6edae708bf 3f0a6766e0
коміт 5bc65793cb
1042 змінених файлів з 45302 додано та 7344 видалено

Переглянути файл

@@ -47,6 +47,7 @@
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/workqueue.h>
#include <linux/netdevice.h>
#include <linux/inetdevice.h>
@@ -235,6 +236,9 @@ static int ether1394_open(struct net_device *dev)
/* This is called after an "ifdown" */
static int ether1394_stop(struct net_device *dev)
{
/* flush priv->wake */
flush_scheduled_work();
netif_stop_queue(dev);
return 0;
}
@@ -530,6 +534,37 @@ static void ether1394_init_dev(struct net_device *dev)
dev->tx_queue_len = 1000;
}
/*
* Wake the queue up after commonly encountered transmit failure conditions are
* hopefully over. Currently only tlabel exhaustion is accounted for.
*/
static void ether1394_wake_queue(struct work_struct *work)
{
struct eth1394_priv *priv;
struct hpsb_packet *packet;
priv = container_of(work, struct eth1394_priv, wake);
packet = hpsb_alloc_packet(0);
/* This is really bad, but unjam the queue anyway. */
if (!packet)
goto out;
packet->host = priv->host;
packet->node_id = priv->wake_node;
/*
* A transaction label is all we really want. If we get one, it almost
* always means we can get a lot more because the ieee1394 core recycled
* a whole batch of tlabels, at last.
*/
if (hpsb_get_tlabel(packet) == 0)
hpsb_free_tlabel(packet);
hpsb_free_packet(packet);
out:
netif_wake_queue(priv->wake_dev);
}
/*
* This function is called every time a card is found. It is generally called
* when the module is installed. This is where we add all of our ethernet
@@ -564,16 +599,17 @@ static void ether1394_add_host(struct hpsb_host *host)
}
SET_MODULE_OWNER(dev);
#if 0
/* FIXME - Is this the correct parent device anyway? */
SET_NETDEV_DEV(dev, &host->device);
#endif
/* This used to be &host->device in Linux 2.6.20 and before. */
SET_NETDEV_DEV(dev, host->device.parent);
priv = netdev_priv(dev);
INIT_LIST_HEAD(&priv->ip_node_list);
spin_lock_init(&priv->lock);
priv->host = host;
priv->local_fifo = fifo_addr;
INIT_WORK(&priv->wake, ether1394_wake_queue);
priv->wake_dev = dev;
hi = hpsb_create_hostinfo(&eth1394_highlevel, host, sizeof(*hi));
if (hi == NULL) {
@@ -1390,22 +1426,17 @@ static int ether1394_prep_write_packet(struct hpsb_packet *p,
u64 addr, void *data, int tx_len)
{
p->node_id = node;
p->data = NULL;
if (hpsb_get_tlabel(p))
return -EAGAIN;
p->tcode = TCODE_WRITEB;
p->header[1] = host->node_id << 16 | addr >> 32;
p->header[2] = addr & 0xffffffff;
p->header_size = 16;
p->expect_response = 1;
if (hpsb_get_tlabel(p)) {
ETH1394_PRINT_G(KERN_ERR, "Out of tlabels\n");
return -1;
}
p->header[0] =
p->node_id << 16 | p->tlabel << 10 | 1 << 8 | TCODE_WRITEB << 4;
p->header[1] = host->node_id << 16 | addr >> 32;
p->header[2] = addr & 0xffffffff;
p->header[3] = tx_len << 16;
p->data_size = (tx_len + 3) & ~3;
p->data = data;
@@ -1451,7 +1482,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len)
packet = ether1394_alloc_common_packet(priv->host);
if (!packet)
return -1;
return -ENOMEM;
if (ptask->tx_type == ETH1394_GASP) {
int length = tx_len + 2 * sizeof(quadlet_t);
@@ -1462,7 +1493,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len)
ptask->addr, ptask->skb->data,
tx_len)) {
hpsb_free_packet(packet);
return -1;
return -EAGAIN;
}
ptask->packet = packet;
@@ -1471,7 +1502,7 @@ static int ether1394_send_packet(struct packet_task *ptask, unsigned int tx_len)
if (hpsb_send_packet(packet) < 0) {
ether1394_free_packet(packet);
return -1;
return -EIO;
}
return 0;
@@ -1514,13 +1545,18 @@ static void ether1394_complete_cb(void *__ptask)
ptask->outstanding_pkts--;
if (ptask->outstanding_pkts > 0 && !fail) {
int tx_len;
int tx_len, err;
/* Add the encapsulation header to the fragment */
tx_len = ether1394_encapsulate(ptask->skb, ptask->max_payload,
&ptask->hdr);
if (ether1394_send_packet(ptask, tx_len))
err = ether1394_send_packet(ptask, tx_len);
if (err) {
if (err == -EAGAIN)
ETH1394_PRINT_G(KERN_ERR, "Out of tlabels\n");
ether1394_dg_complete(ptask, 1);
}
} else {
ether1394_dg_complete(ptask, fail);
}
@@ -1633,10 +1669,18 @@ static int ether1394_tx(struct sk_buff *skb, struct net_device *dev)
/* Add the encapsulation header to the fragment */
tx_len = ether1394_encapsulate(skb, max_payload, &ptask->hdr);
dev->trans_start = jiffies;
if (ether1394_send_packet(ptask, tx_len))
goto fail;
if (ether1394_send_packet(ptask, tx_len)) {
if (dest_node == (LOCAL_BUS | ALL_NODES))
goto fail;
/* Most failures of ether1394_send_packet are recoverable. */
netif_stop_queue(dev);
priv->wake_node = dest_node;
schedule_work(&priv->wake);
kmem_cache_free(packet_task_cache, ptask);
return NETDEV_TX_BUSY;
}
netif_wake_queue(dev);
return NETDEV_TX_OK;
fail:
if (ptask)
@@ -1650,9 +1694,6 @@ fail:
priv->stats.tx_errors++;
spin_unlock_irqrestore(&priv->lock, flags);
if (netif_queue_stopped(dev))
netif_wake_queue(dev);
/*
* FIXME: According to a patch from 2003-02-26, "returning non-zero
* causes serious problems" here, allegedly. Before that patch,

Переглянути файл

@@ -66,6 +66,10 @@ struct eth1394_priv {
int bc_dgl; /* Outgoing broadcast datagram label */
struct list_head ip_node_list; /* List of IP capable nodes */
struct unit_directory *ud_list[ALL_NODES]; /* Cached unit dir list */
struct work_struct wake; /* Wake up after xmit failure */
struct net_device *wake_dev; /* Stupid backlink for .wake */
nodeid_t wake_node; /* Destination of failed xmit */
};

Переглянути файл

@@ -936,6 +936,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req)
struct hpsb_packet *packet;
int header_length = req->req.misc & 0xffff;
int expect_response = req->req.misc >> 16;
size_t data_size;
if (header_length > req->req.length || header_length < 12 ||
header_length > FIELD_SIZEOF(struct hpsb_packet, header)) {
@@ -945,7 +946,8 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req)
return sizeof(struct raw1394_request);
}
packet = hpsb_alloc_packet(req->req.length - header_length);
data_size = req->req.length - header_length;
packet = hpsb_alloc_packet(data_size);
req->packet = packet;
if (!packet)
return -ENOMEM;
@@ -960,7 +962,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req)
if (copy_from_user
(packet->data, int2ptr(req->req.sendb) + header_length,
packet->data_size)) {
data_size)) {
req->req.error = RAW1394_ERROR_MEMFAULT;
req->req.length = 0;
queue_complete_req(req);
@@ -974,7 +976,7 @@ static int handle_async_send(struct file_info *fi, struct pending_request *req)
packet->host = fi->host;
packet->expect_response = expect_response;
packet->header_size = header_length;
packet->data_size = req->req.length - header_length;
packet->data_size = data_size;
req->req.length = 0;
hpsb_set_packet_complete_task(packet,

Переглянути файл

@@ -70,6 +70,7 @@
#include <linux/stringify.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/workqueue.h>
#include <asm/byteorder.h>
#include <asm/errno.h>