static void klsi_105_close (struct usb_serial_port *port,
struct file *filp);
static int klsi_105_write (struct usb_serial_port *port,
+ int from_user,
const unsigned char *buf,
int count);
static void klsi_105_write_bulk_callback (struct urb *urb, struct pt_regs *regs);
for (j = 0; j < NUM_URBS; j++) {
if (write_urbs[j]) {
/* FIXME - uncomment the following
- * usb_kill_urb call when the host
+ * usb_unlink_urb call when the host
* controllers get fixed to set
* urb->dev = NULL after the urb is
* finished. Otherwise this call
* oopses. */
- /* usb_kill_urb(write_urbs[j]); */
+ /* usb_unlink_urb(write_urbs[j]); */
if (write_urbs[j]->transfer_buffer)
kfree(write_urbs[j]->transfer_buffer);
usb_free_urb (write_urbs[j]);
err("Disabling read failed (error = %d)", rc);
/* shutdown our bulk reads and writes */
- usb_kill_urb(port->write_urb);
- usb_kill_urb(port->read_urb);
+ usb_unlink_urb (port->write_urb);
+ usb_unlink_urb (port->read_urb);
/* unlink our write pool */
/* FIXME */
/* wgg - do I need this? I think so. */
- usb_kill_urb(port->interrupt_in_urb);
+ usb_unlink_urb (port->interrupt_in_urb);
info("kl5kusb105 port stats: %ld bytes in, %ld bytes out", priv->bytes_in, priv->bytes_out);
} /* klsi_105_close */
#define KLSI_105_DATA_OFFSET 2 /* in the bulk urb data block */
-static int klsi_105_write (struct usb_serial_port *port,
+static int klsi_105_write (struct usb_serial_port *port, int from_user,
const unsigned char *buf, int count)
{
struct klsi_105_private *priv = usb_get_serial_port_data(port);
size = min (count, port->bulk_out_size - KLSI_105_DATA_OFFSET);
size = min (size, URB_TRANSFER_BUFFER_SIZE - KLSI_105_DATA_OFFSET);
- memcpy (urb->transfer_buffer + KLSI_105_DATA_OFFSET, buf, size);
+ if (from_user) {
+ if (copy_from_user(urb->transfer_buffer
+ + KLSI_105_DATA_OFFSET, buf, size)) {
+ return -EFAULT;
+ }
+ } else {
+ memcpy (urb->transfer_buffer + KLSI_105_DATA_OFFSET,
+ buf, size);
+ }
/* write payload size into transfer buffer */
((__u8 *)urb->transfer_buffer)[0] = (__u8) (size & 0xFF);
static void klsi_105_throttle (struct usb_serial_port *port)
{
dbg("%s - port %d", __FUNCTION__, port->number);
- usb_kill_urb(port->read_urb);
+ usb_unlink_urb (port->read_urb);
}
static void klsi_105_unthrottle (struct usb_serial_port *port)