diff -urN linux-6.4.10.orig/arch/m68k/include/asm/kmap.h linux-6.4.10.q40/arch/m68k/include/asm/kmap.h --- linux-6.4.10.orig/arch/m68k/include/asm/kmap.h 2023-08-11 11:14:29.000000000 +0100 +++ linux-6.4.10.q40/arch/m68k/include/asm/kmap.h 2023-08-13 15:36:32.400206567 +0100 @@ -61,7 +61,7 @@ #define ioport_map ioport_map static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) { - return (void __iomem *) port; + return (void __iomem *) port + 0x10000UL; /* NOW YOU HAVE TWO PROBLEMS */ } #define ioport_unmap ioport_unmap diff -urN linux-6.4.10.orig/drivers/ata/pata_falcon.c linux-6.4.10.q40/drivers/ata/pata_falcon.c --- linux-6.4.10.orig/drivers/ata/pata_falcon.c 2023-08-11 11:14:29.000000000 +0100 +++ linux-6.4.10.q40/drivers/ata/pata_falcon.c 2023-08-13 15:47:18.426870857 +0100 @@ -43,12 +43,14 @@ { struct ata_device *dev = qc->dev; struct ata_port *ap = dev->link->ap; - void __iomem *data_addr = ap->ioaddr.data_addr; + void __iomem *data_addr = ap->private_data; unsigned int words = buflen >> 1; struct scsi_cmnd *cmd = qc->scsicmd; bool swap = 1; - if (dev->class == ATA_DEV_ATA && cmd && + /* WRS: on my Q40 I need byteswapping to read from any normal disks? */ + if (!MACH_IS_Q40 && + dev->class == ATA_DEV_ATA && cmd && !blk_rq_is_passthrough(scsi_cmd_to_rq(cmd))) swap = 0; @@ -165,26 +167,40 @@ ap->pio_mask = ATA_PIO4; ap->flags |= ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_IORDY; - base = (void __iomem *)base_mem_res->start; - /* N.B. this assumes data_addr will be used for word-sized I/O only */ - ap->ioaddr.data_addr = base + 0 + 0 * 4; - ap->ioaddr.error_addr = base + 1 + 1 * 4; - ap->ioaddr.feature_addr = base + 1 + 1 * 4; - ap->ioaddr.nsect_addr = base + 1 + 2 * 4; - ap->ioaddr.lbal_addr = base + 1 + 3 * 4; - ap->ioaddr.lbam_addr = base + 1 + 4 * 4; - ap->ioaddr.lbah_addr = base + 1 + 5 * 4; - ap->ioaddr.device_addr = base + 1 + 6 * 4; - ap->ioaddr.status_addr = base + 1 + 7 * 4; - ap->ioaddr.command_addr = base + 1 + 7 * 4; - - base = (void __iomem *)ctl_mem_res->start; - ap->ioaddr.altstatus_addr = base + 1; - ap->ioaddr.ctl_addr = base + 1; - - ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", - (unsigned long)base_mem_res->start, - (unsigned long)ctl_mem_res->start); + if (MACH_IS_Q40) { + ap->private_data = isa_itw(base_res->start); + ap->ioaddr.cmd_addr = ioport_map(base_res->start, 8); + ap->ioaddr.ctl_addr = ioport_map(ctl_res->start, 1); + ata_sff_std_ports(&ap->ioaddr); + ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr; + + ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", + (unsigned long)base_res->start, + (unsigned long)ctl_res->start); + } else { + base = (void __iomem *)base_mem_res->start; + /* N.B. this assumes data_addr will be used for word-sized I/O only */ + ap->ioaddr.data_addr = base + 0 + 0 * 4; + ap->ioaddr.error_addr = base + 1 + 1 * 4; + ap->ioaddr.feature_addr = base + 1 + 1 * 4; + ap->ioaddr.nsect_addr = base + 1 + 2 * 4; + ap->ioaddr.lbal_addr = base + 1 + 3 * 4; + ap->ioaddr.lbam_addr = base + 1 + 4 * 4; + ap->ioaddr.lbah_addr = base + 1 + 5 * 4; + ap->ioaddr.device_addr = base + 1 + 6 * 4; + ap->ioaddr.status_addr = base + 1 + 7 * 4; + ap->ioaddr.command_addr = base + 1 + 7 * 4; + + base = (void __iomem *)ctl_mem_res->start; + ap->ioaddr.altstatus_addr = base + 1; + ap->ioaddr.ctl_addr = base + 1; + + ap->private_data = ap->ioaddr.data_addr; /* UNTESTED */ + + ata_port_desc(ap, "cmd 0x%lx ctl 0x%lx", + (unsigned long)base_mem_res->start, + (unsigned long)ctl_mem_res->start); + } irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (irq_res && irq_res->start > 0) { diff -urN linux-6.4.10.orig/drivers/net/ethernet/8390/ne.c linux-6.4.10.q40/drivers/net/ethernet/8390/ne.c --- linux-6.4.10.orig/drivers/net/ethernet/8390/ne.c 2023-08-11 11:14:29.000000000 +0100 +++ linux-6.4.10.q40/drivers/net/ethernet/8390/ne.c 2023-08-13 20:05:09.993504684 +0100 @@ -468,8 +468,11 @@ #endif } - if (dev->irq < 2) - { + if (dev->irq < 2 +#ifdef CONFIG_Q40 + && !MACH_IS_Q40 /* Q40 cannot do IRQ probing, it just locks up */ +#endif + ) { unsigned long cookie = probe_irq_on(); outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */ outb_p(0x00, ioaddr + EN0_RCNTLO); diff -urN linux-6.4.10.orig/Makefile linux-6.4.10.q40/Makefile --- linux-6.4.10.orig/Makefile 2023-08-11 11:14:29.000000000 +0100 +++ linux-6.4.10.q40/Makefile 2023-08-13 14:49:35.522277706 +0100 @@ -388,7 +388,8 @@ # Alternatively CROSS_COMPILE can be set in the environment. # Default value for CROSS_COMPILE is not to prefix executables # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile -ARCH ?= $(SUBARCH) +ARCH ?= m68k +CROSS_COMPILE ?= m68k-linux-gnu- # Architecture as present in compile.h UTS_MACHINE := $(ARCH)