if (!state->xmit.buf) {
                state->xmit.buf = (unsigned char *) page;
                uart_circ_clear(&state->xmit);
+               uart_port_unlock(uport, flags);
        } else {
+               uart_port_unlock(uport, flags);
+               /*
+                * Do not free() the page under the port lock, see
+                * uart_shutdown().
+                */
                free_page(page);
        }
-       uart_port_unlock(uport, flags);
 
        retval = uport->ops->startup(uport);
        if (retval == 0) {
        struct uart_port *uport = uart_port_check(state);
        struct tty_port *port = &state->port;
        unsigned long flags = 0;
+       char *xmit_buf = NULL;
 
        /*
         * Set the TTY IO error marker
        tty_port_set_suspended(port, 0);
 
        /*
-        * Free the transmit buffer page.
+        * Do not free() the transmit buffer page under the port lock since
+        * this can create various circular locking scenarios. For instance,
+        * console driver may need to allocate/free a debug object, which
+        * can endup in printk() recursion.
         */
        uart_port_lock(state, flags);
-       if (state->xmit.buf) {
-               free_page((unsigned long)state->xmit.buf);
-               state->xmit.buf = NULL;
-       }
+       xmit_buf = state->xmit.buf;
+       state->xmit.buf = NULL;
        uart_port_unlock(uport, flags);
+
+       if (xmit_buf)
+               free_page((unsigned long)xmit_buf);
 }
 
 /**