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

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

 




Le 2 nov. 08 à 07:00, Finn Thain a écrit :


Nice work!


Thank you.

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.

OK.



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.

OK


...
+	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.


OK

...
+
+/* 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.

OK

HEAD_SEL? MOTOR_ON?

Yes


...
+
+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.


I check that.

+
+	/* 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?

I check that, 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...


You're wrong...

+
+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

type is always 0, but floppy_type[] is used with values 3, 2 and 1.

Well, as I've not a lot of time, I'm working only on the MFM support (to read floppy written on a PC)


...
+
+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.


OK

+
+	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?


I try  this.

Regards,
Laurent
----------------------- Laurent Vivier ----------------------
"The best way to predict the future is to invent it."
- Alan Kay





--
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