Release 4.11 drivers/scsi/arm/oak.c
/*
* Oak Generic NCR5380 driver
*
* Copyright 1995-2002, Russell King
*/
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/blkdev.h>
#include <linux/init.h>
#include <asm/ecard.h>
#include <asm/io.h>
#include <scsi/scsi_host.h>
#define priv(host) ((struct NCR5380_hostdata *)(host)->hostdata)
#define NCR5380_read(reg) readb(hostdata->io + ((reg) << 2))
#define NCR5380_write(reg, value) writeb(value, hostdata->io + ((reg) << 2))
#define NCR5380_dma_xfer_len NCR5380_dma_xfer_none
#define NCR5380_dma_recv_setup oakscsi_pread
#define NCR5380_dma_send_setup oakscsi_pwrite
#define NCR5380_dma_residual NCR5380_dma_residual_none
#define NCR5380_queue_command oakscsi_queue_command
#define NCR5380_info oakscsi_info
#define NCR5380_implementation_fields
/* none */
#include "../NCR5380.h"
#undef START_DMA_INITIATOR_RECEIVE_REG
#define START_DMA_INITIATOR_RECEIVE_REG (128 + 7)
#define STAT ((128 + 16) << 2)
#define DATA ((128 + 8) << 2)
static inline int oakscsi_pwrite(struct NCR5380_hostdata *hostdata,
unsigned char *addr, int len)
{
u8 __iomem *base = hostdata->io;
printk("writing %p len %d\n",addr, len);
while(1)
{
int status;
while (((status = readw(base + STAT)) & 0x100)==0);
}
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 54 | 77.14% | 1 | 16.67% |
Finn Thain | 9 | 12.86% | 4 | 66.67% |
Russell King | 7 | 10.00% | 1 | 16.67% |
Total | 70 | 100.00% | 6 | 100.00% |
static inline int oakscsi_pread(struct NCR5380_hostdata *hostdata,
unsigned char *addr, int len)
{
u8 __iomem *base = hostdata->io;
printk("reading %p len %d\n", addr, len);
while(len > 0)
{
unsigned int status, timeout;
unsigned long b;
timeout = 0x01FFFFFF;
while (((status = readw(base + STAT)) & 0x100)==0)
{
timeout--;
if(status & 0x200 || !timeout)
{
printk("status = %08X\n", status);
return -1;
}
}
if(len >= 128)
{
readsw(base + DATA, addr, 128);
addr += 128;
len -= 128;
}
else
{
b = (unsigned long) readw(base + DATA);
*addr ++ = b;
len -= 1;
if(len)
*addr ++ = b>>8;
len -= 1;
}
}
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds (pre-git) | 157 | 88.20% | 1 | 16.67% |
Russell King | 14 | 7.87% | 1 | 16.67% |
Finn Thain | 7 | 3.93% | 4 | 66.67% |
Total | 178 | 100.00% | 6 | 100.00% |
#undef STAT
#undef DATA
#include "../NCR5380.c"
static struct scsi_host_template oakscsi_template = {
.module = THIS_MODULE,
.name = "Oak 16-bit SCSI",
.info = oakscsi_info,
.queuecommand = oakscsi_queue_command,
.eh_abort_handler = NCR5380_abort,
.eh_bus_reset_handler = NCR5380_bus_reset,
.can_queue = 16,
.this_id = 7,
.sg_tablesize = SG_ALL,
.cmd_per_lun = 2,
.use_clustering = DISABLE_CLUSTERING,
.proc_name = "oakscsi",
.cmd_size = NCR5380_CMD_SIZE,
.max_sectors = 128,
};
static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
{
struct Scsi_Host *host;
int ret = -ENOMEM;
ret = ecard_request_resources(ec);
if (ret)
goto out;
host = scsi_host_alloc(&oakscsi_template, sizeof(struct NCR5380_hostdata));
if (!host) {
ret = -ENOMEM;
goto release;
}
priv(host)->io = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
ecard_resource_len(ec, ECARD_RES_MEMC));
if (!priv(host)->io) {
ret = -ENOMEM;
goto unreg;
}
host->irq = NO_IRQ;
ret = NCR5380_init(host, FLAG_DMA_FIXUP | FLAG_LATE_DMA_SETUP);
if (ret)
goto out_unmap;
NCR5380_maybe_reset_bus(host);
ret = scsi_add_host(host, &ec->dev);
if (ret)
goto out_exit;
scsi_scan_host(host);
goto out;
out_exit:
NCR5380_exit(host);
out_unmap:
iounmap(priv(host)->io);
unreg:
scsi_host_put(host);
release:
ecard_release_resources(ec);
out:
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Russell King | 153 | 73.21% | 3 | 23.08% |
Finn Thain | 29 | 13.88% | 6 | 46.15% |
Linus Torvalds | 12 | 5.74% | 1 | 7.69% |
Christoph Hellwig | 10 | 4.78% | 2 | 15.38% |
Mike Anderson | 5 | 2.39% | 1 | 7.69% |
Total | 209 | 100.00% | 13 | 100.00% |
static void oakscsi_remove(struct expansion_card *ec)
{
struct Scsi_Host *host = ecard_get_drvdata(ec);
void __iomem *base = priv(host)->io;
ecard_set_drvdata(ec, NULL);
scsi_remove_host(host);
NCR5380_exit(host);
scsi_host_put(host);
iounmap(base);
ecard_release_resources(ec);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Russell King | 42 | 64.62% | 2 | 40.00% |
Finn Thain | 15 | 23.08% | 1 | 20.00% |
James Bottomley | 5 | 7.69% | 1 | 20.00% |
Linus Torvalds | 3 | 4.62% | 1 | 20.00% |
Total | 65 | 100.00% | 5 | 100.00% |
static const struct ecard_id oakscsi_cids[] = {
{ MANU_OAK, PROD_OAK_SCSI },
{ 0xffff, 0xffff }
};
static struct ecard_driver oakscsi_driver = {
.probe = oakscsi_probe,
.remove = oakscsi_remove,
.id_table = oakscsi_cids,
.drv = {
.name = "oakscsi",
},
};
static int __init oakscsi_init(void)
{
return ecard_register_driver(&oakscsi_driver);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Russell King | 13 | 81.25% | 1 | 50.00% |
Linus Torvalds | 3 | 18.75% | 1 | 50.00% |
Total | 16 | 100.00% | 2 | 100.00% |
static void __exit oakscsi_exit(void)
{
ecard_remove_driver(&oakscsi_driver);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linus Torvalds | 13 | 86.67% | 1 | 50.00% |
Russell King | 2 | 13.33% | 1 | 50.00% |
Total | 15 | 100.00% | 2 | 100.00% |
module_init(oakscsi_init);
module_exit(oakscsi_exit);
MODULE_AUTHOR("Russell King");
MODULE_DESCRIPTION("Oak SCSI driver");
MODULE_LICENSE("GPL");
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Russell King | 336 | 41.58% | 6 | 19.35% |
Linus Torvalds (pre-git) | 248 | 30.69% | 1 | 3.23% |
Linus Torvalds | 107 | 13.24% | 3 | 9.68% |
Finn Thain | 93 | 11.51% | 14 | 45.16% |
Christoph Hellwig | 12 | 1.49% | 3 | 9.68% |
Mike Anderson | 5 | 0.62% | 1 | 3.23% |
James Bottomley | 5 | 0.62% | 1 | 3.23% |
Arjan van de Ven | 1 | 0.12% | 1 | 3.23% |
Adrian Bunk | 1 | 0.12% | 1 | 3.23% |
Greg Kroah-Hartman | | 0.00% | 0 | 0.00% |
Total | 808 | 100.00% | 31 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.