aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/advansys.c
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew@wil.cx>2007-07-30 11:14:52 -0400
committerJames Bottomley <jejb@mulgrave.localdomain>2007-10-12 14:39:01 -0400
commitb09e05a73e8308397371edc15b7d45082971fa95 (patch)
tree3f727e4ebf6bcab57aa1a9e056eb5813bf97ec50 /drivers/scsi/advansys.c
parent78e77d8b50633241d34cd9e64626d39d0a8cd2c0 (diff)
[SCSI] advansys: Convert to EISA driver model
- Switch EISA probing to the driver model - Remove some now-unused macros and functions - Update the FIXME now that we use the correct driver model probing API Signed-off-by: Matthew Wilcox <matthew@wil.cx> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/advansys.c')
-rw-r--r--drivers/scsi/advansys.c175
1 files changed, 94 insertions, 81 deletions
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index 3ba70323345d..e096f19e4dd9 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -769,6 +769,7 @@
769#include <linux/proc_fs.h> 769#include <linux/proc_fs.h>
770#include <linux/init.h> 770#include <linux/init.h>
771#include <linux/blkdev.h> 771#include <linux/blkdev.h>
772#include <linux/eisa.h>
772#include <linux/pci.h> 773#include <linux/pci.h>
773#include <linux/spinlock.h> 774#include <linux/spinlock.h>
774#include <linux/dma-mapping.h> 775#include <linux/dma-mapping.h>
@@ -783,13 +784,9 @@
783#include <scsi/scsi.h> 784#include <scsi/scsi.h>
784#include <scsi/scsi_host.h> 785#include <scsi/scsi_host.h>
785 786
786/* FIXME: (by jejb@steeleye.com) This warning is present for two 787/* FIXME: (by jejb@steeleye.com)
787 * reasons:
788 * 788 *
789 * 1) This driver badly needs converting to the correct driver model 789 * Although all of the necessary command mapping places have the
790 * probing API
791 *
792 * 2) Although all of the necessary command mapping places have the
793 * appropriate dma_map.. APIs, the driver still processes its internal 790 * appropriate dma_map.. APIs, the driver still processes its internal
794 * queue using bus_to_virt() and virt_to_bus() which are illegal under 791 * queue using bus_to_virt() and virt_to_bus() which are illegal under
795 * the API. The entire queue processing structure will need to be 792 * the API. The entire queue processing structure will need to be
@@ -1787,16 +1784,10 @@ typedef struct asceep_config {
1787#define ASC_1000_ID0W 0x04C1 1784#define ASC_1000_ID0W 0x04C1
1788#define ASC_1000_ID0W_FIX 0x00C1 1785#define ASC_1000_ID0W_FIX 0x00C1
1789#define ASC_1000_ID1B 0x25 1786#define ASC_1000_ID1B 0x25
1790#define ASC_EISA_BIG_IOP_GAP (0x1C30-0x0C50)
1791#define ASC_EISA_SMALL_IOP_GAP (0x0020)
1792#define ASC_EISA_MIN_IOP_ADDR (0x0C30)
1793#define ASC_EISA_MAX_IOP_ADDR (0xFC50)
1794#define ASC_EISA_REV_IOP_MASK (0x0C83) 1787#define ASC_EISA_REV_IOP_MASK (0x0C83)
1795#define ASC_EISA_PID_IOP_MASK (0x0C80) 1788#define ASC_EISA_PID_IOP_MASK (0x0C80)
1796#define ASC_EISA_CFG_IOP_MASK (0x0C86) 1789#define ASC_EISA_CFG_IOP_MASK (0x0C86)
1797#define ASC_GET_EISA_SLOT(iop) (PortAddr)((iop) & 0xF000) 1790#define ASC_GET_EISA_SLOT(iop) (PortAddr)((iop) & 0xF000)
1798#define ASC_EISA_ID_740 0x01745004UL
1799#define ASC_EISA_ID_750 0x01755004UL
1800#define INS_HALTINT (ushort)0x6281 1791#define INS_HALTINT (ushort)0x6281
1801#define INS_HALT (ushort)0x6280 1792#define INS_HALT (ushort)0x6280
1802#define INS_SINT (ushort)0x6200 1793#define INS_SINT (ushort)0x6200
@@ -1943,8 +1934,6 @@ static int AscIsrQDone(ASC_DVC_VAR *);
1943static int AscCompareString(uchar *, uchar *, int); 1934static int AscCompareString(uchar *, uchar *, int);
1944#ifdef CONFIG_ISA 1935#ifdef CONFIG_ISA
1945static ushort AscGetEisaChipCfg(PortAddr); 1936static ushort AscGetEisaChipCfg(PortAddr);
1946static ASC_DCNT AscGetEisaProductID(PortAddr);
1947static PortAddr AscSearchIOPortAddrEISA(PortAddr);
1948static PortAddr AscSearchIOPortAddr11(PortAddr); 1937static PortAddr AscSearchIOPortAddr11(PortAddr);
1949static PortAddr AscSearchIOPortAddr(PortAddr, ushort); 1938static PortAddr AscSearchIOPortAddr(PortAddr, ushort);
1950static void AscSetISAPNPWaitForKey(void); 1939static void AscSetISAPNPWaitForKey(void);
@@ -3418,7 +3407,7 @@ typedef struct {
3418 3407
3419#define ASC_NUM_BOARD_SUPPORTED 16 3408#define ASC_NUM_BOARD_SUPPORTED 16
3420#define ASC_NUM_IOPORT_PROBE 4 3409#define ASC_NUM_IOPORT_PROBE 4
3421#define ASC_NUM_BUS 3 3410#define ASC_NUM_BUS 2
3422 3411
3423/* Reference Scsi_Host hostdata */ 3412/* Reference Scsi_Host hostdata */
3424#define ASC_BOARDP(host) ((asc_board_t *) &((host)->hostdata)) 3413#define ASC_BOARDP(host) ((asc_board_t *) &((host)->hostdata))
@@ -3864,7 +3853,6 @@ static ASC_SG_HEAD asc_sg_head = { 0 };
3864static ushort asc_bus[ASC_NUM_BUS] __initdata = { 3853static ushort asc_bus[ASC_NUM_BUS] __initdata = {
3865 ASC_IS_ISA, 3854 ASC_IS_ISA,
3866 ASC_IS_VL, 3855 ASC_IS_VL,
3867 ASC_IS_EISA,
3868}; 3856};
3869 3857
3870static int asc_iopflag = ASC_FALSE; 3858static int asc_iopflag = ASC_FALSE;
@@ -3874,7 +3862,6 @@ static int asc_ioport[ASC_NUM_IOPORT_PROBE] = { 0, 0, 0, 0 };
3874static char *asc_bus_name[ASC_NUM_BUS] = { 3862static char *asc_bus_name[ASC_NUM_BUS] = {
3875 "ASC_IS_ISA", 3863 "ASC_IS_ISA",
3876 "ASC_IS_VL", 3864 "ASC_IS_VL",
3877 "ASC_IS_EISA",
3878}; 3865};
3879 3866
3880static int asc_dbglvl = 3; 3867static int asc_dbglvl = 3;
@@ -8241,12 +8228,6 @@ static PortAddr __init AscSearchIOPortAddr(PortAddr iop_beg, ushort bus_type)
8241 } 8228 }
8242 return (0); 8229 return (0);
8243 } 8230 }
8244 if (bus_type & ASC_IS_EISA) {
8245 if ((iop_beg = AscSearchIOPortAddrEISA(iop_beg)) != 0) {
8246 return (iop_beg);
8247 }
8248 return (0);
8249 }
8250 return (0); 8231 return (0);
8251} 8232}
8252 8233
@@ -10256,57 +10237,6 @@ static void DvcDelayNanoSecond(ASC_DVC_VAR *asc_dvc, ASC_DCNT nano_sec)
10256 udelay((nano_sec + 999) / 1000); 10237 udelay((nano_sec + 999) / 1000);
10257} 10238}
10258 10239
10259#ifdef CONFIG_ISA
10260static ASC_DCNT __init AscGetEisaProductID(PortAddr iop_base)
10261{
10262 PortAddr eisa_iop;
10263 ushort product_id_high, product_id_low;
10264 ASC_DCNT product_id;
10265
10266 eisa_iop = ASC_GET_EISA_SLOT(iop_base) | ASC_EISA_PID_IOP_MASK;
10267 product_id_low = inpw(eisa_iop);
10268 product_id_high = inpw(eisa_iop + 2);
10269 product_id = ((ASC_DCNT) product_id_high << 16) |
10270 (ASC_DCNT) product_id_low;
10271 return (product_id);
10272}
10273
10274static PortAddr __init AscSearchIOPortAddrEISA(PortAddr iop_base)
10275{
10276 ASC_DCNT eisa_product_id;
10277
10278 if (iop_base == 0) {
10279 iop_base = ASC_EISA_MIN_IOP_ADDR;
10280 } else {
10281 if (iop_base == ASC_EISA_MAX_IOP_ADDR)
10282 return (0);
10283 if ((iop_base & 0x0050) == 0x0050) {
10284 iop_base += ASC_EISA_BIG_IOP_GAP;
10285 } else {
10286 iop_base += ASC_EISA_SMALL_IOP_GAP;
10287 }
10288 }
10289 while (iop_base <= ASC_EISA_MAX_IOP_ADDR) {
10290 eisa_product_id = AscGetEisaProductID(iop_base);
10291 if ((eisa_product_id == ASC_EISA_ID_740) ||
10292 (eisa_product_id == ASC_EISA_ID_750)) {
10293 if (AscFindSignature(iop_base)) {
10294 inpw(iop_base + 4);
10295 return (iop_base);
10296 }
10297 }
10298 if (iop_base == ASC_EISA_MAX_IOP_ADDR)
10299 return (0);
10300 if ((iop_base & 0x0050) == 0x0050) {
10301 iop_base += ASC_EISA_BIG_IOP_GAP;
10302 } else {
10303 iop_base += ASC_EISA_SMALL_IOP_GAP;
10304 }
10305 }
10306 return (0);
10307}
10308#endif /* CONFIG_ISA */
10309
10310static int AscStartChip(PortAddr iop_base) 10240static int AscStartChip(PortAddr iop_base)
10311{ 10241{
10312 AscSetChipControl(iop_base, 0); 10242 AscSetChipControl(iop_base, 0);
@@ -18607,12 +18537,6 @@ static int __init advansys_detect(void)
18607#endif /* CONFIG_ISA */ 18537#endif /* CONFIG_ISA */
18608 break; 18538 break;
18609 18539
18610 case ASC_IS_EISA:
18611#ifdef CONFIG_ISA
18612 iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
18613#endif /* CONFIG_ISA */
18614 break;
18615
18616 default: 18540 default:
18617 ASC_PRINT1 18541 ASC_PRINT1
18618 ("advansys_detect: unknown bus type: %d\n", 18542 ("advansys_detect: unknown bus type: %d\n",
@@ -18667,6 +18591,87 @@ static int advansys_release(struct Scsi_Host *shost)
18667 return 0; 18591 return 0;
18668} 18592}
18669 18593
18594static struct eisa_device_id advansys_eisa_table[] __devinitdata = {
18595 { "ABP7401" },
18596 { "ABP7501" },
18597 { "" }
18598};
18599
18600MODULE_DEVICE_TABLE(eisa, advansys_eisa_table);
18601
18602/*
18603 * EISA is a little more tricky than PCI; each EISA device may have two
18604 * channels, and this driver is written to make each channel its own Scsi_Host
18605 */
18606struct eisa_scsi_data {
18607 struct Scsi_Host *host[2];
18608};
18609
18610static int __devinit advansys_eisa_probe(struct device *dev)
18611{
18612 int i, ioport;
18613 int err;
18614 struct eisa_device *edev = to_eisa_device(dev);
18615 struct eisa_scsi_data *data;
18616
18617 err = -ENOMEM;
18618 data = kzalloc(sizeof(*data), GFP_KERNEL);
18619 if (!data)
18620 goto fail;
18621 ioport = edev->base_addr + 0xc30;
18622
18623 err = -ENODEV;
18624 for (i = 0; i < 2; i++, ioport += 0x20) {
18625 if (!AscFindSignature(ioport))
18626 continue;
18627 /*
18628 * I don't know why we need to do this for EISA chips, but
18629 * not for any others. It looks to be equivalent to
18630 * AscGetChipCfgMsw, but I may have overlooked something,
18631 * so I'm not converting it until I get an EISA board to
18632 * test with.
18633 */
18634 inw(ioport + 4);
18635 data->host[i] = advansys_board_found(ioport, dev, ASC_IS_EISA);
18636 if (data->host[i])
18637 err = 0;
18638 }
18639
18640 if (err) {
18641 kfree(data);
18642 } else {
18643 dev_set_drvdata(dev, data);
18644 }
18645
18646 fail:
18647 return err;
18648}
18649
18650static __devexit int advansys_eisa_remove(struct device *dev)
18651{
18652 int i;
18653 struct eisa_scsi_data *data = dev_get_drvdata(dev);
18654
18655 for (i = 0; i < 2; i++) {
18656 struct Scsi_Host *shost = data->host[i];
18657 if (!shost)
18658 continue;
18659 advansys_release(shost);
18660 }
18661
18662 kfree(data);
18663 return 0;
18664}
18665
18666static struct eisa_driver advansys_eisa_driver = {
18667 .id_table = advansys_eisa_table,
18668 .driver = {
18669 .name = "advansys",
18670 .probe = advansys_eisa_probe,
18671 .remove = __devexit_p(advansys_eisa_remove),
18672 }
18673};
18674
18670/* PCI Devices supported by this driver */ 18675/* PCI Devices supported by this driver */
18671static struct pci_device_id advansys_pci_tbl[] __devinitdata = { 18676static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
18672 {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A, 18677 {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
@@ -18732,12 +18737,19 @@ static int __init advansys_init(void)
18732{ 18737{
18733 int i, error; 18738 int i, error;
18734 advansys_detect(); 18739 advansys_detect();
18735 error = pci_register_driver(&advansys_pci_driver); 18740
18741 error = eisa_driver_register(&advansys_eisa_driver);
18736 if (error) 18742 if (error)
18737 goto fail; 18743 goto fail;
18738 18744
18745 error = pci_register_driver(&advansys_pci_driver);
18746 if (error)
18747 goto unregister_eisa;
18748
18739 return 0; 18749 return 0;
18740 18750
18751 unregister_eisa:
18752 eisa_driver_unregister(&advansys_eisa_driver);
18741 fail: 18753 fail:
18742 for (i = 0; i < asc_legacy_count; i++) 18754 for (i = 0; i < asc_legacy_count; i++)
18743 advansys_release(asc_host[i]); 18755 advansys_release(asc_host[i]);
@@ -18750,6 +18762,7 @@ static void __exit advansys_exit(void)
18750 int i; 18762 int i;
18751 18763
18752 pci_unregister_driver(&advansys_pci_driver); 18764 pci_unregister_driver(&advansys_pci_driver);
18765 eisa_driver_unregister(&advansys_eisa_driver);
18753 18766
18754 for (i = 0; i < asc_legacy_count; i++) 18767 for (i = 0; i < asc_legacy_count; i++)
18755 advansys_release(asc_host[i]); 18768 advansys_release(asc_host[i]);