NOZOMI_NAME, dc);
        if (unlikely(ret)) {
                dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
-               goto err_free_kfifo;
+               goto err_free_all_kfifo;
        }
 
        DBG1("base_addr: %p", dc->base_addr);
        return 0;
 
 err_free_tty:
-       for (i = 0; i < MAX_PORT; ++i) {
+       for (i--; i >= 0; i--) {
                tty_unregister_device(ntty_driver, dc->index_start + i);
                tty_port_destroy(&dc->port[i].port);
        }
        free_irq(pdev->irq, dc);
+err_free_all_kfifo:
+       i = MAX_PORT;
 err_free_kfifo:
-       for (i = 0; i < MAX_PORT; i++)
+       for (i--; i >= PORT_MDM; i--)
                kfifo_free(&dc->port[i].fifo_ul);
 err_free_sbuf:
        kfree(dc->send_buf);