--- ./readcd/readcd.c.orig	2017-09-27 06:34:31 -0500
+++ ./readcd/readcd.c	2017-09-27 06:44:01 -0500
@@ -1896,10 +1896,7 @@
 	long	addr;
 	int	cnt;
 {
-	if (addr <= G0_MAXADDR)
-		return (write_g0(scgp, bp, addr, cnt));
-	else
-		return (write_g1(scgp, bp, addr, cnt));
+	return (write_g1(scgp, bp, addr, cnt));
 }
 
 EXPORT int
@@ -2341,6 +2338,9 @@
 	long	end = 0L;
 	int	msec;
 	int	start;
+#ifdef _AIX
+	extern  int     using_ide;
+#endif
 
 	if (is_suid)
 		comerrno(EX_BAD, _("Not root. Will not write in suid/priv mode\n"));
@@ -2396,6 +2396,13 @@
 	if (gettimeofday(&starttime, (struct timezone *)0) < 0)
 		comerr(_("Cannot get start time\n"));
 
+#ifdef _AIX
+	if (using_ide) {
+		while ((cnt * scgp->cap->c_bsize) > 65535) /* USHRT_MAX */
+			cnt = cnt/2;
+	}
+#endif
+
 	for (; addr < end; addr += cnt) {
 		if (didintr)
 			comexit(exsig);		/* XXX besseres Konzept?!*/
--- ./libscg/scsi-aix.c.orig	2017-09-27 06:52:59 -0500
+++ ./libscg/scsi-aix.c	2017-09-27 06:59:22 -0500
@@ -88,6 +88,9 @@
 LOCAL	int	do_scg_cmd	__PR((SCSI *scgp, struct scg_cmd *sp));
 LOCAL	int	do_scg_sense	__PR((SCSI *scgp, struct scg_cmd *sp));
 
+/*GLOBAL*/ enum { unknown, dkiocmd, dkpassthru, idepassthru } using = unknown;
+/*GLOBAL*/ int  using_ide = 0;
+
 /*
  * Return version information for the low level SCSI transport code.
  * This has been introduced to make it easier to trace down problems
