if (pipenum > 0)
                r8a66597_write(r8a66597, ~(1 << pipenum), BEMPSTS);
        if (urb->transfer_buffer) {
-               r8a66597_write_fifo(r8a66597, td->pipe->fifoaddr, buf, size);
+               r8a66597_write_fifo(r8a66597, td->pipe, buf, size);
                if (!usb_pipebulk(urb->pipe) || td->maxpacket != size)
                        r8a66597_write(r8a66597, BVAL, td->pipe->fifoctr);
        }
 
        iowrite16(val, r8a66597->reg + offset);
 }
 
+static inline void r8a66597_mdfy(struct r8a66597 *r8a66597,
+                                u16 val, u16 pat, unsigned long offset)
+{
+       u16 tmp;
+       tmp = r8a66597_read(r8a66597, offset);
+       tmp = tmp & (~pat);
+       tmp = tmp | val;
+       r8a66597_write(r8a66597, tmp, offset);
+}
+
+#define r8a66597_bclr(r8a66597, val, offset)   \
+                       r8a66597_mdfy(r8a66597, 0, val, offset)
+#define r8a66597_bset(r8a66597, val, offset)   \
+                       r8a66597_mdfy(r8a66597, val, 0, offset)
+
 static inline void r8a66597_write_fifo(struct r8a66597 *r8a66597,
-                                      unsigned long offset, u16 *buf,
+                                      struct r8a66597_pipe *pipe, u16 *buf,
                                       int len)
 {
-       void __iomem *fifoaddr = r8a66597->reg + offset;
+       void __iomem *fifoaddr = r8a66597->reg + pipe->fifoaddr;
        unsigned long count;
        unsigned char *pb;
        int i;
                iowrite16_rep(fifoaddr, buf, len);
                if (unlikely(odd)) {
                        buf = &buf[len];
+                       if (r8a66597->pdata->wr0_shorted_to_wr1)
+                               r8a66597_bclr(r8a66597, MBW_16, pipe->fifosel);
                        iowrite8((unsigned char)*buf, fifoaddr);
+                       if (r8a66597->pdata->wr0_shorted_to_wr1)
+                               r8a66597_bset(r8a66597, MBW_16, pipe->fifosel);
                }
        }
 }
 
-static inline void r8a66597_mdfy(struct r8a66597 *r8a66597,
-                                u16 val, u16 pat, unsigned long offset)
-{
-       u16 tmp;
-       tmp = r8a66597_read(r8a66597, offset);
-       tmp = tmp & (~pat);
-       tmp = tmp | val;
-       r8a66597_write(r8a66597, tmp, offset);
-}
-
-#define r8a66597_bclr(r8a66597, val, offset)   \
-                       r8a66597_mdfy(r8a66597, 0, val, offset)
-#define r8a66597_bset(r8a66597, val, offset)   \
-                       r8a66597_mdfy(r8a66597, val, 0, offset)
-
 static inline unsigned long get_syscfg_reg(int port)
 {
        return port == 0 ? SYSCFG0 : SYSCFG1;