if (status) {
                dbg("%s - urb status = %d", __func__, status);
-               if (!port->port.count) {
-                       dbg("%s - port is closed, exiting.", __func__);
-                       return;
-               }
                if (status == -EPROTO) {
                        dbg("%s - caught -EPROTO, resubmitting the urb",
                            __func__);
        }
        tty_kref_put(tty);
 
-       /* Schedule the next read _if_ we are still open */
-       if (port->port.count) {
-               usb_fill_bulk_urb(port->read_urb, port->serial->dev,
-                                 usb_rcvbulkpipe(port->serial->dev,
-                                         port->bulk_in_endpointAddress),
-                                 port->read_urb->transfer_buffer,
-                                 port->read_urb->transfer_buffer_length,
-                                 aircable_read_bulk_callback, port);
-
-               result = usb_submit_urb(urb, GFP_ATOMIC);
-               if (result)
-                       dev_err(&urb->dev->dev,
-                               "%s - failed resubmitting read urb, error %d\n",
-                               __func__, result);
-       }
-
-       return;
+       /* Schedule the next read */
+       usb_fill_bulk_urb(port->read_urb, port->serial->dev,
+                         usb_rcvbulkpipe(port->serial->dev,
+                                 port->bulk_in_endpointAddress),
+                         port->read_urb->transfer_buffer,
+                         port->read_urb->transfer_buffer_length,
+                         aircable_read_bulk_callback, port);
+
+       result = usb_submit_urb(urb, GFP_ATOMIC);
+       if (result && result != -EPERM)
+               dev_err(&urb->dev->dev,
+                       "%s - failed resubmitting read urb, error %d\n",
+                       __func__, result);
 }
 
 /* Based on ftdi_sio.c throttle */
 
 continue_read:
        tty_kref_put(tty);
 
-       /* Continue trying to always read... unless the port has closed. */
+       /* Continue trying to always read */
 
-       if (port->port.count > 0 && priv->comm_is_ok) {
+       if (priv->comm_is_ok) {
                usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
                                usb_rcvintpipe(port->serial->dev,
                                        port->interrupt_in_endpointAddress),
                                cypress_read_int_callback, port,
                                priv->read_urb_interval);
                result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
-               if (result) {
+               if (result && result != -EPERM) {
                        dev_err(&urb->dev->dev, "%s - failed resubmitting "
                                        "read urb, error %d\n", __func__,
                                        result);
 
                return;
        }
 
-       /* try to send any buffered data on this port, if it is open */
+       /* try to send any buffered data on this port */
        spin_lock(&priv->dp_port_lock);
        priv->dp_write_urb_in_use = 0;
-       if (port->port.count && priv->dp_out_buf_len > 0) {
+       if (priv->dp_out_buf_len > 0) {
                *((unsigned char *)(port->write_urb->transfer_buffer))
                        = (unsigned char)DIGI_CMD_SEND_DATA;
                *((unsigned char *)(port->write_urb->transfer_buffer) + 1)
        schedule_work(&priv->dp_wakeup_work);
 
        spin_unlock(&priv->dp_port_lock);
-       if (ret)
+       if (ret && ret != -EPERM)
                dev_err(&port->dev,
                        "%s: usb_submit_urb failed, ret=%d, port=%d\n",
                        __func__, ret, priv->dp_port_num);
        struct digi_port *priv = usb_get_serial_port_data(port);
        struct ktermios not_termios;
 
-       dbg("digi_open: TOP: port=%d, open_count=%d",
-               priv->dp_port_num, port->port.count);
+       dbg("digi_open: TOP: port=%d", priv->dp_port_num);
 
        /* be sure the device is started up */
        if (digi_startup_device(port->serial) != 0)
        unsigned char buf[32];
        struct digi_port *priv = usb_get_serial_port_data(port);
 
-       dbg("digi_close: TOP: port=%d, open_count=%d",
-               priv->dp_port_num, port->port.count);
+       dbg("digi_close: TOP: port=%d", priv->dp_port_num);
 
        mutex_lock(&port->serial->disc_mutex);
        /* if disconnected, just clear flags */
        /* continue read */
        urb->dev = port->serial->dev;
        ret = usb_submit_urb(urb, GFP_ATOMIC);
-       if (ret != 0) {
+       if (ret != 0 && ret != -EPERM) {
                dev_err(&port->dev,
                        "%s: failed resubmitting urb, ret=%d, port=%d\n",
                        __func__, ret, priv->dp_port_num);
 
        /* do not process callbacks on closed ports */
        /* but do continue the read chain */
-       if (port->port.count == 0)
+       if (urb->status == -ENOENT)
                return 0;
 
        /* short/multiple packet check */
 
                tty = tty_port_tty_get(&port->port);
                rts = 0;
-               if (port->port.count)
-                       rts = tty->termios->c_cflag & CRTSCTS;
+               rts = tty->termios->c_cflag & CRTSCTS;
                
                if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
                        spin_lock(&priv->dp_port_lock);
 
 #include <linux/usb/serial.h>
 #include <linux/uaccess.h>
 #include <linux/kfifo.h>
+#include <linux/serial.h>
 
 static int debug;
 
 
        for (i = 0; i < serial->num_ports; i++) {
                port = serial->port[i];
-               if (!port->port.count)
+               if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
                        continue;
 
                if (port->read_urb) {
 
 
        dbg("%s - port %d", __func__, port->number);
 
-       if (!port->port.count) {
-               dbg("%s - port closed.", __func__);
-               return;
-       }
-
        switch (status) {
        case 0: /* Successful */
                /*
 
 
        /* Resubmit urb so we continue receiving */
        urb->dev = port->serial->dev;
-       if (port->port.count) {
-               err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err != 0)
-                       dbg("%s - resubmit read urb failed. (%d)",
-                                       __func__, err);
-       }
-       return;
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (err != 0)
+               dbg("%s - resubmit read urb failed. (%d)", __func__, err);
 }
 
 /* Outdat handling is common for all devices */
        p_priv = usb_get_serial_port_data(port);
        dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]);
 
-       if (port->port.count)
-               usb_serial_port_softint(port);
+       usb_serial_port_softint(port);
 }
 
 static void    usa26_inack_callback(struct urb *urb)
 
                /* Resubmit urb so we continue receiving */
                urb->dev = port->serial->dev;
-               if (port->port.count) {
-                       err = usb_submit_urb(urb, GFP_ATOMIC);
-                       if (err != 0)
-                               dbg("%s - resubmit read urb failed. (%d)",
-                                                               __func__, err);
-               }
+               err = usb_submit_urb(urb, GFP_ATOMIC);
+               if (err != 0)
+                       dbg("%s - resubmit read urb failed. (%d)",
+                                                       __func__, err);
                p_priv->in_flip ^= 1;
 
                urb = p_priv->in_urbs[p_priv->in_flip];
 
        /* Resubmit urb so we continue receiving */
        urb->dev = port->serial->dev;
-       if (port->port.count) {
-               err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err != 0)
-                       dbg("%s - resubmit read urb failed. (%d)",
-                                                       __func__, err);
-       }
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (err != 0)
+               dbg("%s - resubmit read urb failed. (%d)", __func__, err);
 }
 
 static void usa49wg_indat_callback(struct urb *urb)
                                /* no error on any byte */
                                i++;
                                for (x = 1; x < len ; ++x)
-                                       if (port->port.count)
-                                               tty_insert_flip_char(tty,
-                                                               data[i++], 0);
-                                       else
-                                               i++;
+                                       tty_insert_flip_char(tty, data[i++], 0);
                        } else {
                                /*
                                 * some bytes had errors, every byte has status
                                        if (stat & RXERROR_PARITY)
                                                flag |= TTY_PARITY;
                                        /* XXX should handle break (0x10) */
-                                       if (port->port.count)
-                                               tty_insert_flip_char(tty,
+                                       tty_insert_flip_char(tty,
                                                        data[i+1], flag);
                                        i += 2;
                                }
                        }
-                       if (port->port.count)
-                               tty_flip_buffer_push(tty);
+                       tty_flip_buffer_push(tty);
                        tty_kref_put(tty);
                }
        }
 
        /* Resubmit urb so we continue receiving */
        urb->dev = port->serial->dev;
-       if (port->port.count) {
-               err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err != 0)
-                       dbg("%s - resubmit read urb failed. (%d)",
-                                                       __func__, err);
-       }
-       return;
+       err = usb_submit_urb(urb, GFP_ATOMIC);
+       if (err != 0)
+               dbg("%s - resubmit read urb failed. (%d)", __func__, err);
 }
 
 
                msg.portEnabled = 0;
        /* Sending intermediate configs */
        else {
-               if (port->port.count)
-                       msg.portEnabled = 1;
+               msg.portEnabled = 1;
                msg.txBreak = (p_priv->break_on);
        }
 
 
                tty_kref_put(tty);
 
                /* Resubmit urb so we continue receiving */
-               if (port->port.count && status != -ESHUTDOWN) {
+               if (status != -ESHUTDOWN) {
                        err = usb_submit_urb(urb, GFP_ATOMIC);
-                       if (err)
+                       if (err && err != -EPERM)
                                printk(KERN_ERR "%s: resubmit read urb failed. "
                                        "(%d)", __func__, err);
                        else
 
        usb_clear_halt(serial->dev, port->write_urb->pipe);
        usb_clear_halt(serial->dev, port->read_urb->pipe);
 
-       if (port->port.count != 1)
-               return 0;
-
        buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
        if (buf == NULL) {
                dev_err(&port->dev, "%s(): out of memory!\n", __func__);
        spin_unlock_irqrestore(&priv->lock, flags);
 
        if (status != 0) {
-               if (!port->port.count) {
-                       dbg("%s(): port is closed, exiting", __func__);
-                       return;
-               }
                /*
                if (status == -EPROTO) {
                        * PL2303 mysteriously fails with -EPROTO reschedule
        }
        tty_kref_put(tty);
 
-       /* schedule the interrupt urb if we are still open */
-       if (port->port.count != 0) {
-               port->interrupt_in_urb->dev = port->serial->dev;
-               result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
-               if (result != 0) {
-                       dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
-                                       " error %d\n", __func__, result);
-               }
+       /* schedule the interrupt urb */
+       port->interrupt_in_urb->dev = port->serial->dev;
+       result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
+       if (result != 0 && result != -EPERM) {
+               dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
+                               " error %d\n", __func__, result);
        }
 }
 
 
 
        if (status) {
                dbg("%s - urb status = %d", __func__, status);
-               if (!port->port.count) {
-                       dbg("%s - port is closed, exiting.", __func__);
-                       return;
-               }
                if (status == -EPROTO) {
                        /* PL2303 mysteriously fails with -EPROTO reschedule
                         * the read */
        }
        tty_kref_put(tty);
        /* Schedule the next read _if_ we are still open */
-       if (port->port.count) {
-               urb->dev = port->serial->dev;
-               result = usb_submit_urb(urb, GFP_ATOMIC);
-               if (result)
-                       dev_err(&urb->dev->dev, "%s - failed resubmitting"
-                               " read urb, error %d\n", __func__, result);
-       }
-
-       return;
+       urb->dev = port->serial->dev;
+       result = usb_submit_urb(urb, GFP_ATOMIC);
+       if (result && result != -EPERM)
+               dev_err(&urb->dev->dev, "%s - failed resubmitting"
+                       " read urb, error %d\n", __func__, result);
 }
 
 static void pl2303_write_bulk_callback(struct urb *urb)
 
        }
 
        /* Resubmit urb so we continue receiving */
-       if (port->port.count && status != -ESHUTDOWN && status != -EPERM) {
+       if (status != -ESHUTDOWN && status != -EPERM) {
                usb_mark_last_busy(port->serial->dev);
                err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err)
+               if (err && err != -EPERM)
                        dev_err(&port->dev, "resubmit read urb failed."
                                "(%d)\n", err);
        }
                dev_dbg(&port->dev, "%s: error %d\n", __func__, status);
 
        /* Resubmit urb so we continue receiving IRQ data */
-       if (port->port.count && status != -ESHUTDOWN && status != -ENOENT) {
+       if (status != -ESHUTDOWN && status != -ENOENT) {
                usb_mark_last_busy(serial->dev);
                urb->dev = serial->dev;
                err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err)
+               if (err && err != -EPERM)
                        dev_err(&port->dev, "%s: resubmit intr urb "
                                "failed. (%d)\n", __func__, err);
        }
 
 
        /* check the urb status */
        if (result) {
-               if (!port->port.count)
-                       return;
                if (result == -EPROTO) {
                        /* spcp8x5 mysteriously fails with -EPROTO */
                        /* reschedule the read */
        }
        tty_kref_put(tty);
 
-       /* Schedule the next read _if_ we are still open */
-       if (port->port.count) {
-               urb->dev = port->serial->dev;
-               result = usb_submit_urb(urb , GFP_ATOMIC);
-               if (result)
-                       dev_dbg(&port->dev, "failed submitting read urb %d\n",
-                               result);
-       }
-
-       return;
+       /* Schedule the next read */
+       urb->dev = port->serial->dev;
+       result = usb_submit_urb(urb , GFP_ATOMIC);
+       if (result)
+               dev_dbg(&port->dev, "failed submitting read urb %d\n", result);
 }
 
 /* get data from ring buffer and then write to usb bus */