diff -ruN aoe-2.6-10-orig/linux/drivers/block/aoe/aoecmd.c aoe-2.6-10/linux/drivers/block/aoe/aoecmd.c
--- aoe-2.6-10-orig/linux/drivers/block/aoe/aoecmd.c	2005-04-11 22:29:31.000000000 +0400
+++ aoe-2.6-10/linux/drivers/block/aoe/aoecmd.c	2005-06-16 22:23:04.000000000 +0400
@@ -104,6 +104,14 @@
 	return host_tag;
 }
 
+int aoe_max_ata_data = MAXATADATA;
+module_param(aoe_max_ata_data, int, 0600);
+MODULE_PARM_DESC(aoe_max_ata_data, " aoe_max_ata_data=XXXX\n");
+
+int aoe_max_frames = 8;
+module_param(aoe_max_frames, int, 0600);
+MODULE_PARM_DESC(aoe_max_frames, " aoe_max_frames=X\n");
+
 static void
 aoecmd_ata_rw(struct aoedev *d, struct frame *f)
 {
@@ -122,8 +130,8 @@
 
 	sector = buf->sector;
 	bcnt = buf->bv_resid;
-	if (bcnt > MAXATADATA)
-		bcnt = MAXATADATA;
+	if (bcnt > d->max_ata_data)
+		bcnt = d->max_ata_data;
 
 	/* initialize the headers & frame */
 	h = (struct aoe_hdr *) f->data;
@@ -619,8 +627,8 @@
 	}
 
 	bufcnt = be16_to_cpu(ch->bufcnt);
-	if (bufcnt > MAXFRAMES)	/* keep it reasonable */
-		bufcnt = MAXFRAMES;
+	if (bufcnt > aoe_max_frames)	/* keep it reasonable */
+		bufcnt = aoe_max_frames;
 
 	d = aoedev_set(sysminor, h->src, skb->dev, bufcnt);
 	if (d == NULL) {
diff -ruN aoe-2.6-10-orig/linux/drivers/block/aoe/aoedev.c aoe-2.6-10/linux/drivers/block/aoe/aoedev.c
--- aoe-2.6-10-orig/linux/drivers/block/aoe/aoedev.c	2005-04-11 22:29:31.000000000 +0400
+++ aoe-2.6-10/linux/drivers/block/aoe/aoedev.c	2005-06-16 22:24:39.000000000 +0400
@@ -100,6 +100,9 @@
 	d->flags &= ~DEVFL_UP;
 }
 
+extern int aoe_max_ata_data;
+extern int aoe_max_frames;
+
 struct aoedev *
 aoedev_set(ulong sysminor, unsigned char *addr, struct net_device *ifp, ulong bufcnt)
 {
@@ -122,6 +125,15 @@
 	spin_lock_irqsave(&d->lock, flags);
 
 	d->ifp = ifp;
+	if (aoe_max_ata_data) {
+		d->max_ata_data = aoe_max_ata_data;
+	} else {
+		d->max_ata_data = d->ifp->mtu;
+		d->max_ata_data -= (sizeof(struct aoe_hdr));
+		d->max_ata_data -= (sizeof(struct aoe_atahdr));
+		d->max_ata_data = (d->max_ata_data >> 9) << 9;
+	}
+
 	memcpy(d->addr, addr, sizeof d->addr);
 	if ((d->flags & DEVFL_UP) == 0) {
 		aoedev_downdev(d); /* flushes outstanding frames */
diff -ruN aoe-2.6-10-orig/linux/drivers/block/aoe/aoe.h aoe-2.6-10/linux/drivers/block/aoe/aoe.h
--- aoe-2.6-10-orig/linux/drivers/block/aoe/aoe.h	2005-04-11 22:29:31.000000000 +0400
+++ aoe-2.6-10/linux/drivers/block/aoe/aoe.h	2005-06-16 22:21:18.000000000 +0400
@@ -137,6 +137,7 @@
 	struct timer_list timer;
 	spinlock_t lock;
 	struct net_device *ifp;	/* interface ed is attached to */
+	int max_ata_data;
 	struct sk_buff *sendq_hd; /* packets needing to be sent, list head */
 	struct sk_buff *sendq_tl;
 	mempool_t *bufpool;	/* for deadlock-free Buf allocation */
