spi = neuronspi_s_dev[port->dev_index];
        d_data = spi_get_drvdata(spi);
+       spin_lock(&port->port.lock);
        xmit = &port->port.state->xmit;
+       spin_unlock(&port->port.lock);
 
        if (unlikely(port->port.x_char)) {
                neuronspi_spi_uart_write(spi, &port->port.x_char, 1, port->dev_port);
+               spin_lock(&port->port.lock);
                port->port.icount.tx++;
+               spin_unlock(&port->port.lock);
                port->port.x_char = 0;
                spin_lock(&port->tx_lock);
                port->tx_work_count--;
        }
 
        /* Get length of data pending in circular buffer */
+       spin_lock(&port->port.lock);
        to_send = uart_circ_chars_pending(xmit);
+       spin_unlock(&port->port.lock);
        printk(KERN_INFO "NEURONSPI UART_HANDLE_TX A, to_send:%d, tx_work_count:%d\n", to_send, port->tx_work_count);
        if (likely(to_send)) {
                /* Limit to size of (TX FIFO / 2) */
-               max_txlen = NEURONSPI_FIFO_SIZE >> 1;
+               max_txlen = NEURONSPI_FIFO_SIZE >> 2;
                while (to_send > max_txlen) {
                        to_send_packet = (to_send > max_txlen) ? max_txlen : to_send;
 
                        /* Add data to send */
+                       spin_lock(&port->port.lock);
                        port->port.icount.tx += to_send_packet;
+                       spin_unlock(&port->port.lock);
 
                        /* Convert to linear buffer */
                        for (i = 0; i < to_send_packet; ++i) {
+                               spin_lock(&port->port.lock);
                                port->buf[i] = xmit->buf[xmit->tail];
                                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+                               spin_unlock(&port->port.lock);
                        }
                        printk(KERN_INFO "NEURONSPI UART_HANDLE_TX B, to_send:%d, tx_work_count:%d\n", to_send_packet, port->tx_work_count);
                        neuronspi_uart_fifo_write(port, to_send_packet);
                to_send = (to_send > NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS) ? NEURONSPI_FIFO_SIZE - NEURONSPI_FIFO_MIN_CONTINUOUS : to_send;
 
                /* Add data to send */
+               spin_lock(&port->port.lock);
                port->port.icount.tx += to_send;
+               spin_unlock(&port->port.lock);
 
                /* Convert to linear buffer */
                for (i = 0; i < to_send; ++i) {
+                       spin_lock(&port->port.lock);
                        port->buf[i] = xmit->buf[xmit->tail];
                        xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+                       spin_unlock(&port->port.lock);
                }
                printk(KERN_INFO "NEURONSPI UART_HANDLE_TX C, to_send:%d, tx_work_count:%d\n", to_send, port->tx_work_count);
                neuronspi_uart_fifo_write(port, to_send);
        spin_unlock(&port->tx_lock);
 
        if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) {
+               spin_lock(&port->port.lock);
                uart_write_wakeup(&port->port);
+               spin_unlock(&port->port.lock);
        }
 }