git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mmc-omap: add support for 16-bit and 32-bit registers
[safe/jmp/linux-2.6]
/
drivers
/
scsi
/
libsrp.c
diff --git
a/drivers/scsi/libsrp.c
b/drivers/scsi/libsrp.c
index
5631c19
..
ff6a28c
100644
(file)
--- a/
drivers/scsi/libsrp.c
+++ b/
drivers/scsi/libsrp.c
@@
-1,5
+1,5
@@
/*
/*
- * SCSI RD
AM
Protocol lib functions
+ * SCSI RD
MA
Protocol lib functions
*
* Copyright (C) 2006 FUJITA Tomonori <tomof@acm.org>
*
*
* Copyright (C) 2006 FUJITA Tomonori <tomof@acm.org>
*
@@
-19,6
+19,7
@@
* 02110-1301 USA
*/
#include <linux/err.h>
* 02110-1301 USA
*/
#include <linux/err.h>
+#include <linux/slab.h>
#include <linux/kfifo.h>
#include <linux/scatterlist.h>
#include <linux/dma-mapping.h>
#include <linux/kfifo.h>
#include <linux/scatterlist.h>
#include <linux/dma-mapping.h>
@@
-39,7
+40,7
@@
enum srp_task_attributes {
/* tmp - will replace with SCSI logging stuff */
#define eprintk(fmt, args...) \
do { \
/* tmp - will replace with SCSI logging stuff */
#define eprintk(fmt, args...) \
do { \
- printk("%s(%d) " fmt, __
FUNCTION__, __LINE__, ##args);
\
+ printk("%s(%d) " fmt, __
func__, __LINE__, ##args);
\
} while (0)
/* #define dprintk eprintk */
#define dprintk(fmt, args...)
} while (0)
/* #define dprintk eprintk */
#define dprintk(fmt, args...)
@@
-58,19
+59,15
@@
static int srp_iu_pool_alloc(struct srp_queue *q, size_t max,
goto free_pool;
spin_lock_init(&q->lock);
goto free_pool;
spin_lock_init(&q->lock);
- q->queue = kfifo_init((void *) q->pool, max * sizeof(void *),
- GFP_KERNEL, &q->lock);
- if (IS_ERR(q->queue))
- goto free_item;
+ kfifo_init(&q->queue, (void *) q->pool, max * sizeof(void *));
for (i = 0, iue = q->items; i < max; i++) {
for (i = 0, iue = q->items; i < max; i++) {
-
__kfifo_put(
q->queue, (void *) &iue, sizeof(void *));
+
kfifo_in(&
q->queue, (void *) &iue, sizeof(void *));
iue->sbuf = ring[i];
iue++;
}
return 0;
iue->sbuf = ring[i];
iue++;
}
return 0;
-free_item:
kfree(q->items);
free_pool:
kfree(q->pool);
kfree(q->items);
free_pool:
kfree(q->pool);
@@
-124,6
+121,7
@@
static void srp_ring_free(struct device *dev, struct srp_buf **ring, size_t max,
dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma);
kfree(ring[i]);
}
dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma);
kfree(ring[i]);
}
+ kfree(ring);
}
int srp_target_alloc(struct srp_target *target, struct device *dev,
}
int srp_target_alloc(struct srp_target *target, struct device *dev,
@@
-135,7
+133,7
@@
int srp_target_alloc(struct srp_target *target, struct device *dev,
INIT_LIST_HEAD(&target->cmd_queue);
target->dev = dev;
INIT_LIST_HEAD(&target->cmd_queue);
target->dev = dev;
-
target->dev->driver_data = target
;
+
dev_set_drvdata(target->dev, target)
;
target->srp_iu_size = iu_size;
target->rx_ring_size = nr;
target->srp_iu_size = iu_size;
target->rx_ring_size = nr;
@@
-166,7
+164,11
@@
struct iu_entry *srp_iu_get(struct srp_target *target)
{
struct iu_entry *iue = NULL;
{
struct iu_entry *iue = NULL;
- kfifo_get(target->iu_queue.queue, (void *) &iue, sizeof(void *));
+ if (kfifo_out_locked(&target->iu_queue.queue, (void *) &iue,
+ sizeof(void *), &target->iu_queue.lock) != sizeof(void *)) {
+ WARN_ONCE(1, "unexpected fifo state");
+ return NULL;
+ }
if (!iue)
return iue;
iue->target = target;
if (!iue)
return iue;
iue->target = target;
@@
-178,7
+180,8
@@
EXPORT_SYMBOL_GPL(srp_iu_get);
void srp_iu_put(struct iu_entry *iue)
{
void srp_iu_put(struct iu_entry *iue)
{
- kfifo_put(iue->target->iu_queue.queue, (void *) &iue, sizeof(void *));
+ kfifo_in_locked(&iue->target->iu_queue.queue, (void *) &iue,
+ sizeof(void *), &iue->target->iu_queue.lock);
}
EXPORT_SYMBOL_GPL(srp_iu_put);
}
EXPORT_SYMBOL_GPL(srp_iu_put);
@@
-192,18
+195,18
@@
static int srp_direct_data(struct scsi_cmnd *sc, struct srp_direct_buf *md,
if (dma_map) {
iue = (struct iu_entry *) sc->SCp.ptr;
if (dma_map) {
iue = (struct iu_entry *) sc->SCp.ptr;
- sg = sc
->request_buffer
;
+ sg = sc
si_sglist(sc)
;
- dprintk("%p %u %u %d\n", iue, sc
->request_bufflen
,
- md->len, sc
->use_sg
);
+ dprintk("%p %u %u %d\n", iue, sc
si_bufflen(sc)
,
+ md->len, sc
si_sg_count(sc)
);
- nsg = dma_map_sg(iue->target->dev, sg, sc
->use_sg
,
+ nsg = dma_map_sg(iue->target->dev, sg, sc
si_sg_count(sc)
,
DMA_BIDIRECTIONAL);
if (!nsg) {
DMA_BIDIRECTIONAL);
if (!nsg) {
- printk("fail to map %p %d\n", iue, sc
->use_sg
);
+ printk("fail to map %p %d\n", iue, sc
si_sg_count(sc)
);
return 0;
}
return 0;
}
- len = min(sc
->request_bufflen
, md->len);
+ len = min(sc
si_bufflen(sc)
, md->len);
} else
len = md->len;
} else
len = md->len;
@@
-229,10
+232,10
@@
static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
if (dma_map || ext_desc) {
iue = (struct iu_entry *) sc->SCp.ptr;
if (dma_map || ext_desc) {
iue = (struct iu_entry *) sc->SCp.ptr;
- sg = sc
->request_buffer
;
+ sg = sc
si_sglist(sc)
;
dprintk("%p %u %u %d %d\n",
dprintk("%p %u %u %d %d\n",
- iue, sc
->request_bufflen
, id->len,
+ iue, sc
si_bufflen(sc)
, id->len,
cmd->data_in_desc_cnt, cmd->data_out_desc_cnt);
}
cmd->data_in_desc_cnt, cmd->data_out_desc_cnt);
}
@@
-254,6
+257,7
@@
static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
sg_init_one(&dummy, md, id->table_desc.len);
sg_dma_address(&dummy) = token;
sg_init_one(&dummy, md, id->table_desc.len);
sg_dma_address(&dummy) = token;
+ sg_dma_len(&dummy) = id->table_desc.len;
err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE,
id->table_desc.len);
if (err) {
err = rdma_io(sc, &dummy, 1, &id->table_desc, 1, DMA_TO_DEVICE,
id->table_desc.len);
if (err) {
@@
-267,13
+271,14
@@
static int srp_indirect_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
rdma:
if (dma_map) {
rdma:
if (dma_map) {
- nsg = dma_map_sg(iue->target->dev, sg, sc->use_sg, DMA_BIDIRECTIONAL);
+ nsg = dma_map_sg(iue->target->dev, sg, scsi_sg_count(sc),
+ DMA_BIDIRECTIONAL);
if (!nsg) {
if (!nsg) {
- eprintk("fail to map %p %d\n", iue, sc
->use_sg
);
+ eprintk("fail to map %p %d\n", iue, sc
si_sg_count(sc)
);
err = -EIO;
goto free_mem;
}
err = -EIO;
goto free_mem;
}
- len = min(sc
->request_bufflen
, id->len);
+ len = min(sc
si_bufflen(sc)
, id->len);
} else
len = id->len;
} else
len = id->len;
@@
-324,7
+329,7
@@
int srp_transfer_data(struct scsi_cmnd *sc, struct srp_cmd *cmd,
int offset, err = 0;
u8 format;
int offset, err = 0;
u8 format;
- offset = cmd->add_cdb_len
* 4
;
+ offset = cmd->add_cdb_len
& ~3
;
dir = srp_cmd_direction(cmd);
if (dir == DMA_FROM_DEVICE)
dir = srp_cmd_direction(cmd);
if (dir == DMA_FROM_DEVICE)
@@
-362,7
+367,7
@@
static int vscsis_data_length(struct srp_cmd *cmd, enum dma_data_direction dir)
{
struct srp_direct_buf *md;
struct srp_indirect_buf *id;
{
struct srp_direct_buf *md;
struct srp_indirect_buf *id;
- int len = 0, offset = cmd->add_cdb_len
* 4
;
+ int len = 0, offset = cmd->add_cdb_len
& ~3
;
u8 fmt;
if (dir == DMA_TO_DEVICE)
u8 fmt;
if (dir == DMA_TO_DEVICE)
@@
-391,7
+396,7
@@
static int vscsis_data_length(struct srp_cmd *cmd, enum dma_data_direction dir)
}
int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
}
int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
- u64 addr)
+ u64
itn_id, u64
addr)
{
enum dma_data_direction dir;
struct scsi_cmnd *sc;
{
enum dma_data_direction dir;
struct scsi_cmnd *sc;
@@
-424,10
+429,11
@@
int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
sc->SCp.ptr = info;
memcpy(sc->cmnd, cmd->cdb, MAX_COMMAND_SIZE);
sc->SCp.ptr = info;
memcpy(sc->cmnd, cmd->cdb, MAX_COMMAND_SIZE);
- sc->
request_bufflen
= len;
- sc->
request_buffer
= (void *) (unsigned long) addr;
+ sc->
sdb.length
= len;
+ sc->
sdb.table.sgl
= (void *) (unsigned long) addr;
sc->tag = tag;
sc->tag = tag;
- err = scsi_tgt_queue_command(sc, (struct scsi_lun *) &cmd->lun, cmd->tag);
+ err = scsi_tgt_queue_command(sc, itn_id, (struct scsi_lun *)&cmd->lun,
+ cmd->tag);
if (err)
scsi_host_put_command(shost, sc);
if (err)
scsi_host_put_command(shost, sc);
@@
-435,6
+441,6
@@
int srp_cmd_queue(struct Scsi_Host *shost, struct srp_cmd *cmd, void *info,
}
EXPORT_SYMBOL_GPL(srp_cmd_queue);
}
EXPORT_SYMBOL_GPL(srp_cmd_queue);
-MODULE_DESCRIPTION("SCSI RD
AM
Protocol lib functions");
+MODULE_DESCRIPTION("SCSI RD
MA
Protocol lib functions");
MODULE_AUTHOR("FUJITA Tomonori");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FUJITA Tomonori");
MODULE_LICENSE("GPL");