Re: IDE disks in Amigas
Hi,
On Fri, 4 Apr 2008, Ingo Juergensmann wrote:
> I think I better remove that SCSI disk for now... ;)
> Is there a better SCSI driver in newer kernels? I took a kernel tarball
> from one of my other Amigas to reduce built time, but when 2.6.24.x gives
> me a working SCSI, it's no problem to built a complete new kernel... :)
I played with it some time ago and below is my current patch, it's not
really ready for merging yet, but it survived a gcc compile. :)
bye, Roman
---
drivers/scsi/Kconfig | 8 ++
drivers/scsi/Makefile | 2
drivers/scsi/cyberstormIII.c | 128 +++++++++++++++++++++++++++++++++++++++++++
drivers/scsi/ncr53c8xx.c | 10 ++-
drivers/scsi/ncr53c8xx.h | 27 +++------
5 files changed, 157 insertions(+), 18 deletions(-)
Index: linux-2.6/drivers/scsi/Kconfig
===================================================================
--- linux-2.6.orig/drivers/scsi/Kconfig
+++ linux-2.6/drivers/scsi/Kconfig
@@ -1601,6 +1601,14 @@ config CYBERSTORMII_SCSI
and the optional Cyberstorm SCSI controller, say Y. Otherwise,
answer N.
+config CYBERSTORMIII_SCSI
+ tristate "CyberStorm Mk III SCSI support"
+ depends on ZORRO && SCSI
+ help
+ If you have an Amiga with a Phase5 Cyberstorm MkIII accelerator board
+ and the Cyberstorm SCSI controller, say Y. Otherwise,
+ answer N.
+
config BLZ2060_SCSI
tristate "Blizzard 2060 SCSI support"
depends on ZORRO && SCSI
Index: linux-2.6/drivers/scsi/Makefile
===================================================================
--- linux-2.6.orig/drivers/scsi/Makefile
+++ linux-2.6/drivers/scsi/Makefile
@@ -46,6 +46,7 @@ obj-$(CONFIG_MVME147_SCSI) += mvme147.o
obj-$(CONFIG_SGIWD93_SCSI) += sgiwd93.o wd33c93.o
obj-$(CONFIG_CYBERSTORM_SCSI) += NCR53C9x.o cyberstorm.o
obj-$(CONFIG_CYBERSTORMII_SCSI) += NCR53C9x.o cyberstormII.o
+obj-$(CONFIG_CYBERSTORMIII_SCSI) += cyberstormIII_mod.o
obj-$(CONFIG_BLZ2060_SCSI) += NCR53C9x.o blz2060.o
obj-$(CONFIG_BLZ1230_SCSI) += NCR53C9x.o blz1230.o
obj-$(CONFIG_FASTLANE_SCSI) += NCR53C9x.o fastlane.o
@@ -166,6 +167,7 @@ ncr53c8xx-flags-$(CONFIG_SCSI_ZALON) \
CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m)
zalon7xx-objs := zalon.o ncr53c8xx.o
NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o
+cyberstormIII_mod-objs := cyberstormIII.o ncr53c8xx.o
oktagon_esp_mod-objs := oktagon_esp.o oktagon_io.o
# Files generated that shall be removed upon make clean
Index: linux-2.6/drivers/scsi/cyberstormIII.c
===================================================================
--- /dev/null
+++ linux-2.6/drivers/scsi/cyberstormIII.c
@@ -0,0 +1,128 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/zorro.h>
+
+#include <asm/amigahw.h>
+#include <asm/amigaints.h>
+
+#include "ncr53c8xx.h"
+
+#define CSIII_BASE ZTWO_VADDR(0x00f60000)
+#define CSIII_REG_RESET (CSIII_BASE + 0x00)
+#define CSIII_REG_IRQ (CSIII_BASE + 0x08)
+#define CSIII_REG_WAITSTATE (CSIII_BASE + 0x10)
+#define CSIII_REG_SHADOW (CSIII_BASE + 0x18)
+#define CSIII_REG_LOCK (CSIII_BASE + 0x20)
+#define CSIII_REG_INT (CSIII_BASE + 0x28)
+#define CSIII_IPL_EMU (CSIII_BASE + 0x30)
+#define CSIII_INT_LVL (CSIII_BASE + 0x38)
+
+
+static struct scsi_host_template csIII_host_template = {
+ .module = THIS_MODULE,
+ .proc_name = "cyberstormIII",
+ .name = "CyberStorm III SCSI",
+};
+
+static struct ncr_chip csIII_chip = {
+ .burst_max = 4,
+ .offset_max = 8,
+ .nr_divisor = 5,
+ .features = FE_WIDE | FE_EA | FE_ULTRA | FE_RAM,
+};
+
+irqreturn_t csIII_interrupt(int irq, void *dev_id)
+{
+ if (!(raw_inb(CSIII_REG_IRQ) & 1))
+ return ncr53c8xx_intr(irq, dev_id);
+ return IRQ_NONE;
+}
+
+static int __devinit csIII_probe(struct zorro_dev *dev,
+ const struct zorro_device_id *ent)
+{
+ struct Scsi_Host *host;
+ struct ncr_device device;
+ int res = -ENODEV;
+
+ memset(&device, 0, sizeof(struct ncr_device));
+ device.chip = csIII_chip;
+ device.host_id = 7;
+ device.dev = &dev->dev;
+ device.slot.base = 0xf40000;
+ device.slot.base_v = (void *)ZTWO_VADDR(0xf40000);
+ device.slot.base_2 = 0xf41000;
+ device.slot.base_2_v = (void *)ZTWO_VADDR(0xf41000);
+ device.slot.irq = IRQ_AMIGA_PORTS;
+
+ host = ncr_attach(&csIII_host_template, 0, &device);
+ if (!host)
+ goto fail;
+
+ res = request_irq(IRQ_AMIGA_PORTS, csIII_interrupt, IRQF_SHARED, "CyberStorm III SCSI", host);
+ if (res)
+ goto fail_detach;
+
+ raw_outb(0x84, CSIII_REG_IRQ);
+ raw_outb(0x02, CSIII_REG_IRQ);
+ dev_set_drvdata(&dev->dev, host);
+
+ res = scsi_add_host(host, &dev->dev);
+ if (res)
+ goto fail_free_irq;
+ scsi_scan_host(host);
+
+ return 0;
+
+fail_free_irq:
+ free_irq(IRQ_AMIGA_PORTS, host);
+fail_detach:
+ ncr53c8xx_release(host);
+fail:
+ return -ENODEV;
+}
+
+static int __exit csIII_remove(struct zorro_dev *dev)
+{
+ struct Scsi_Host *host = dev_get_drvdata(&dev->dev);
+
+ scsi_remove_host(host);
+ ncr53c8xx_release(host);
+ free_irq(IRQ_AMIGA_PORTS, host);
+
+ return 0;
+}
+
+static struct zorro_device_id csIII_zorro_tbl[] __devinitdata = {
+ { ZORRO_PROD_PHASE5_CYBERSTORM_MK_III , },
+ { 0 }
+};
+
+static struct zorro_driver csIII_driver = {
+ .name = "CyberStorm III SCSI",
+ .id_table = csIII_zorro_tbl,
+ .probe = csIII_probe,
+ .remove = __devexit_p(csIII_remove),
+};
+
+static int __init csIII_init(void)
+{
+ int ret = ncr53c8xx_init();
+ if (!ret)
+ ret = zorro_register_driver(&csIII_driver);
+ if (ret)
+ ncr53c8xx_exit();
+ return ret;
+}
+
+static void __exit csIII_exit(void)
+{
+ zorro_unregister_driver(&csIII_driver);
+ ncr53c8xx_exit();
+}
+
+module_init(csIII_init);
+module_exit(csIII_exit);
+
+MODULE_LICENSE("GPL");
Index: linux-2.6/drivers/scsi/ncr53c8xx.c
===================================================================
--- linux-2.6.orig/drivers/scsi/ncr53c8xx.c
+++ linux-2.6/drivers/scsi/ncr53c8xx.c
@@ -194,7 +194,7 @@ static inline struct list_head *ncr_list
#if PAGE_SIZE >= 8192
#define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */
#else
-#define MEMO_PAGE_ORDER 1 /* 2 PAGES maximum */
+#define MEMO_PAGE_ORDER 0 /* 2 PAGES maximum */
#endif
#define MEMO_FREE_UNUSED /* Free unused pages immediately */
#define MEMO_WARN 1
@@ -1749,6 +1749,7 @@ struct ncb {
** written with a SCR_COPY script command.
**----------------------------------------------------------------
*/
+ char dummy1[0] __attribute__ ((aligned (4)));
u_char msgout[8]; /* Buffer for MESSAGE OUT */
u_char msgin [8]; /* Buffer for MESSAGE IN */
u32 lastmsg; /* Last SCSI message sent */
@@ -1762,6 +1763,7 @@ struct ncb {
u_char scsi_mode; /* Current SCSI BUS mode */
u_char order; /* Tag order to use */
u_char verbose; /* Verbosity for this controller*/
+ char dummy2[0] __attribute__ ((aligned (4)));
int ncr_cache; /* Used for cache test at init. */
u_long p_ncb; /* BUS address of this NCB */
@@ -1770,6 +1772,7 @@ struct ncb {
**----------------------------------------------------------------
*/
#ifdef SCSI_NCR_CCB_DONE_SUPPORT
+ char dummy3[0] __attribute__ ((aligned (4)));
struct ccb *(ccb_done[MAX_DONE]);
int ccb_done_ic;
#endif
@@ -3761,7 +3764,7 @@ static inline void ncr_init_burst(struct
} else {
--bc;
np->rv_dmode |= ((bc & 0x3) << 6);
- np->rv_ctest5 |= (bc & 0x4);
+ np->rv_ctest5 |= 0x4;
}
}
@@ -3800,6 +3803,7 @@ static void __init ncr_prepare_setting(s
np->clock_khz = 80000;
else
np->clock_khz = 40000;
+ np->clock_khz = 50000;
/*
* Get the clock multiplier factor.
@@ -3829,6 +3833,7 @@ static void __init ncr_prepare_setting(s
}
}
np->rv_scntl3 = i+1;
+ np->rv_scntl3 = 5;
/*
* Minimum synchronous period factor supported by the chip.
@@ -3903,6 +3908,7 @@ static void __init ncr_prepare_setting(s
np->rv_dcntl |= EA; /* Enable ACK */
if (np->features & FE_EHP)
np->rv_ctest0 |= EHP; /* Even host parity */
+ np->rv_ctest5 |= 0x04;
/*
** Select some other
Index: linux-2.6/drivers/scsi/ncr53c8xx.h
===================================================================
--- linux-2.6.orig/drivers/scsi/ncr53c8xx.h
+++ linux-2.6/drivers/scsi/ncr53c8xx.h
@@ -55,6 +55,7 @@
#include <scsi/scsi_host.h>
+#define SCSI_NCR_BIG_ENDIAN
/*
** If you want a driver as small as possible, donnot define the
@@ -172,20 +173,20 @@
/*
* Disable master parity checking (flawed hardwares need that)
*/
-#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
+//#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
#define SCSI_NCR_SETUP_MASTER_PARITY (0)
-#else
-#define SCSI_NCR_SETUP_MASTER_PARITY (1)
-#endif
+//#else
+//#define SCSI_NCR_SETUP_MASTER_PARITY (1)
+//#endif
/*
* Disable scsi parity checking (flawed devices may need that)
*/
-#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
+//#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
#define SCSI_NCR_SETUP_SCSI_PARITY (0)
-#else
-#define SCSI_NCR_SETUP_SCSI_PARITY (1)
-#endif
+//#else
+//#define SCSI_NCR_SETUP_SCSI_PARITY (1)
+//#endif
/*
* Settle time after reset at boot-up
@@ -321,12 +322,6 @@
#endif
-#if !defined(__hppa__) && !defined(__mips__)
-#ifdef SCSI_NCR_BIG_ENDIAN
-#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
-#endif
-#endif
-
#define MEMORY_BARRIER() mb()
@@ -561,10 +556,10 @@ struct ncr_driver_setup {
0, \
0, \
1, \
- 0, \
+ 15, \
SCSI_NCR_SETUP_DEFAULT_TAGS, \
SCSI_NCR_SETUP_DEFAULT_SYNC, \
- 0x00, \
+ 0xff, \
7, \
0, \
1, \
Reply to: