Re: [PATCH] Add SWIM floppy support for m68k Macs.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Nice work!

Critique follows.

On Sat, 1 Nov 2008, Laurent@xxxxxxxxxxxx wrote:

Index: linux-2.6/arch/m68k/mac/config.c
===================================================================
--- linux-2.6.orig/arch/m68k/mac/config.c	2008-11-01 06:13:53.000000000 +0100
+++ linux-2.6/arch/m68k/mac/config.c	2008-11-01 06:14:39.000000000 +0100
@@ -70,6 +70,7 @@
 extern void oss_init(void);
 extern void psc_init(void);
 extern void baboon_init(void);
+extern void swim_init(void);
 
 extern void mac_mksound(unsigned int, unsigned int);
 
@@ -815,6 +816,7 @@
 	oss_init();
 	psc_init();
 	baboon_init();
+	swim_init();
 }

It would reduce coupling if config.c didn't need to know about the floppy 
drive... I suspect that the initialisation can be simplified with 
device_initcall.

 static void __init mac_report_hardware(void)
Index: linux-2.6/arch/m68k/mac/swim.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/arch/m68k/mac/swim.c	2008-11-01 06:14:39.000000000 +0100
...
+#define writePhase	*(SWIMBase + 0x0800)
+#define readPhase	*(SWIMBase + 0x1800)

These are unused.

...
+	default:
+		SWIMBase = NULL;
+		printk("SWIM: unknown Macintosh: report to maintainer !\n");

If macintosh_config->ident is not in mac_data_table, config.c prints 
"Detected Macintosh model: Unknown", so there's no need to repeat it here.

...
Index: linux-2.6/drivers/block/swim.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6/drivers/block/swim.c	2008-11-01 10:36:05.000000000 +0100
@@ -0,0 +1,886 @@
+/*
+ * Driver for SWIM (Sander. Woz Integrated Machine) floppy controller

Sander Woz Integrated Machine, also known as Super Woz Integrated Machine.

...
+
+/* bits in mode register */
+
+#define CLFIFO		0x01
+#define ENBL1		0x02
+#define ENBL2		0x04
+#define ACTION		0x08
+#define	WRITE_MODE	0x10
+#define	HEDSEL		0x20
+#define	MOTON		0x80

Extra tabs. HEAD_SEL? MOTOR_ON?

...
+
+static inline void swim_head(head_t head)
+{
+	/* FIXME: IWM reads bits SEL, CA2, CA1 to wait drive ready... */

By SEL, do you mean VIA1A_vHeadSel or the chip register? I wonder if CA1 
and CA2 were used for the floppy on 68000 macs... CA1 and CA2 are timers 
on the Macs we support. Guide to Mac Family hardware might be able to 
clarify this a bit.

+
+	/* wait drive is ready */
+
+	if (head == UPPER_HEAD)
+		swim_select(READ_DATA_1);
+	else if (head == LOWER_HEAD)
+		swim_select(READ_DATA_0);
+}
+
+static inline int swim_step(void)
+{
+	int wait;
+
+	swim_action(STEP);
+
+	for (wait = 0; wait < 80; wait++) {

Should this loop counter be referred to HZ too?

...
+
+static struct floppy_struct floppy_type[4] = {
+	{    0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL },	/*  0 no testing    */
+	{  720, 9,1,80,0,0x2A,0x02,0xDF,0x50,NULL },	/*  3 360KB SS 3.5" */
+	{ 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,NULL },	/*  4 720KB 3.5"    */
+	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,NULL },    /*  7 1.44MB 3.5"   */
+};

The last 3 entries are unused...

+
+static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
+{
+	struct floppy_state *fs;
+	fs = &unit[drive];
+
+	if (drive > floppy_count)
+		return -ENODEV;
+
+	if (type >= ARRAY_SIZE(floppy_type))
+		return -EINVAL;
+
+	if (type)
+		*g = &floppy_type[type];
+	else if (fs->type == HD_MEDIA) /* High-Density media */
+		*g = &floppy_type[3];
+	else if (fs->head_number == 2) /* double-sided */
+		*g = &floppy_type[2];
+	else
+		*g = &floppy_type[1];

...since type is always 0. I wonder how we should deal with 400K and 800K 
floppies. It's academic I guess.

...
+
+static int __init swim_init(void)
+{
+	printk(KERN_INFO "Inserting SWIM floppy driver\n");

Is this for debugging purposes? I'd prefer to avoid the log spam.

+
+	if (base) {
+		printk(KERN_INFO "SWIM: Setting SWIMBase to 0x%p\n", base);
+		SWIMBase = (struct swim *)base;
+	}
+
+	return swim_floppy_init();
+}
+module_init(swim_init)

Can we elimiate the additions to arch/m68k/mac and merge the init routine 
from arch/m68k/mac/swim.c with this one by making it a device_initcall?

Regards,
Finn
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux