static void simdisk_transfer(struct simdisk *dev, unsigned long sector, unsigned long nsect, char *buffer, int write) { unsigned long offset = sector << SECTOR_SHIFT; unsigned long nbytes = nsect << SECTOR_SHIFT; if (offset > dev->size || dev->size - offset < nbytes) { pr_notice("Beyond-end %s (%ld %ld)\n", write ? "write" : "read", offset, nbytes); return; } spin_lock(&dev->lock); while (nbytes > 0) { unsigned long io; simc_lseek(dev->fd, offset, SEEK_SET); READ_ONCE(*buffer); if (write) io = simc_write(dev->fd, buffer, nbytes); else io = simc_read(dev->fd, buffer, nbytes); if (io == -1) { pr_err("SIMDISK: IO error %d\n", errno); break; } buffer += io; offset += io; nbytes -= io; } spin_unlock(&dev->lock); }
static void rs_poll(unsigned long priv) { struct tty_port *port = (struct tty_port *)priv; int i = 0; unsigned char c; spin_lock(&timer_lock); while (simc_poll(0)) { simc_read(0, &c, 1); tty_insert_flip_char(port, c, TTY_NORMAL); i++; } if (i) tty_flip_buffer_push(port); mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); spin_unlock(&timer_lock); }
static void rs_poll(struct timer_list *unused) { struct tty_port *port = &serial_port; int i = 0; int rd = 1; unsigned char c; spin_lock(&timer_lock); while (simc_poll(0)) { rd = simc_read(0, &c, 1); if (rd <= 0) break; tty_insert_flip_char(port, c, TTY_NORMAL); i++; } if (i) tty_flip_buffer_push(port); if (rd) mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); spin_unlock(&timer_lock); }