0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/kernel.h>
0028 #include <linux/errno.h>
0029 #include <linux/slab.h>
0030 #include <linux/tty.h>
0031 #include <linux/tty_driver.h>
0032 #include <linux/tty_flip.h>
0033 #include <linux/module.h>
0034 #include <linux/spinlock.h>
0035 #include <linux/uaccess.h>
0036 #include <linux/usb.h>
0037 #include <linux/usb/serial.h>
0038
0039 #define CYBERJACK_LOCAL_BUF_SIZE 32
0040
0041 #define DRIVER_AUTHOR "Matthias Bruestle"
0042 #define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver"
0043
0044
0045 #define CYBERJACK_VENDOR_ID 0x0C4B
0046 #define CYBERJACK_PRODUCT_ID 0x0100
0047
0048
0049 static int cyberjack_port_probe(struct usb_serial_port *port);
0050 static void cyberjack_port_remove(struct usb_serial_port *port);
0051 static int cyberjack_open(struct tty_struct *tty,
0052 struct usb_serial_port *port);
0053 static void cyberjack_close(struct usb_serial_port *port);
0054 static int cyberjack_write(struct tty_struct *tty,
0055 struct usb_serial_port *port, const unsigned char *buf, int count);
0056 static unsigned int cyberjack_write_room(struct tty_struct *tty);
0057 static void cyberjack_read_int_callback(struct urb *urb);
0058 static void cyberjack_read_bulk_callback(struct urb *urb);
0059 static void cyberjack_write_bulk_callback(struct urb *urb);
0060
0061 static const struct usb_device_id id_table[] = {
0062 { USB_DEVICE(CYBERJACK_VENDOR_ID, CYBERJACK_PRODUCT_ID) },
0063 { }
0064 };
0065
0066 MODULE_DEVICE_TABLE(usb, id_table);
0067
0068 static struct usb_serial_driver cyberjack_device = {
0069 .driver = {
0070 .owner = THIS_MODULE,
0071 .name = "cyberjack",
0072 },
0073 .description = "Reiner SCT Cyberjack USB card reader",
0074 .id_table = id_table,
0075 .num_ports = 1,
0076 .num_bulk_out = 1,
0077 .port_probe = cyberjack_port_probe,
0078 .port_remove = cyberjack_port_remove,
0079 .open = cyberjack_open,
0080 .close = cyberjack_close,
0081 .write = cyberjack_write,
0082 .write_room = cyberjack_write_room,
0083 .read_int_callback = cyberjack_read_int_callback,
0084 .read_bulk_callback = cyberjack_read_bulk_callback,
0085 .write_bulk_callback = cyberjack_write_bulk_callback,
0086 };
0087
0088 static struct usb_serial_driver * const serial_drivers[] = {
0089 &cyberjack_device, NULL
0090 };
0091
0092 struct cyberjack_private {
0093 spinlock_t lock;
0094 short rdtodo;
0095 unsigned char wrbuf[5*64];
0096 short wrfilled;
0097 short wrsent;
0098 };
0099
0100 static int cyberjack_port_probe(struct usb_serial_port *port)
0101 {
0102 struct cyberjack_private *priv;
0103 int result;
0104
0105 priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);
0106 if (!priv)
0107 return -ENOMEM;
0108
0109 spin_lock_init(&priv->lock);
0110 priv->rdtodo = 0;
0111 priv->wrfilled = 0;
0112 priv->wrsent = 0;
0113
0114 usb_set_serial_port_data(port, priv);
0115
0116 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
0117 if (result)
0118 dev_err(&port->dev, "usb_submit_urb(read int) failed\n");
0119
0120 return 0;
0121 }
0122
0123 static void cyberjack_port_remove(struct usb_serial_port *port)
0124 {
0125 struct cyberjack_private *priv;
0126
0127 usb_kill_urb(port->interrupt_in_urb);
0128
0129 priv = usb_get_serial_port_data(port);
0130 kfree(priv);
0131 }
0132
0133 static int cyberjack_open(struct tty_struct *tty,
0134 struct usb_serial_port *port)
0135 {
0136 struct cyberjack_private *priv;
0137 unsigned long flags;
0138
0139 dev_dbg(&port->dev, "%s - usb_clear_halt\n", __func__);
0140 usb_clear_halt(port->serial->dev, port->write_urb->pipe);
0141
0142 priv = usb_get_serial_port_data(port);
0143 spin_lock_irqsave(&priv->lock, flags);
0144 priv->rdtodo = 0;
0145 priv->wrfilled = 0;
0146 priv->wrsent = 0;
0147 spin_unlock_irqrestore(&priv->lock, flags);
0148
0149 return 0;
0150 }
0151
0152 static void cyberjack_close(struct usb_serial_port *port)
0153 {
0154 usb_kill_urb(port->write_urb);
0155 usb_kill_urb(port->read_urb);
0156 }
0157
0158 static int cyberjack_write(struct tty_struct *tty,
0159 struct usb_serial_port *port, const unsigned char *buf, int count)
0160 {
0161 struct device *dev = &port->dev;
0162 struct cyberjack_private *priv = usb_get_serial_port_data(port);
0163 unsigned long flags;
0164 int result;
0165 int wrexpected;
0166
0167 if (count == 0) {
0168 dev_dbg(dev, "%s - write request of 0 bytes\n", __func__);
0169 return 0;
0170 }
0171
0172 if (!test_and_clear_bit(0, &port->write_urbs_free)) {
0173 dev_dbg(dev, "%s - already writing\n", __func__);
0174 return 0;
0175 }
0176
0177 spin_lock_irqsave(&priv->lock, flags);
0178
0179 if (count+priv->wrfilled > sizeof(priv->wrbuf)) {
0180
0181 priv->wrfilled = 0;
0182 spin_unlock_irqrestore(&priv->lock, flags);
0183 set_bit(0, &port->write_urbs_free);
0184 return 0;
0185 }
0186
0187
0188 memcpy(priv->wrbuf + priv->wrfilled, buf, count);
0189
0190 usb_serial_debug_data(dev, __func__, count, priv->wrbuf + priv->wrfilled);
0191 priv->wrfilled += count;
0192
0193 if (priv->wrfilled >= 3) {
0194 wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
0195 dev_dbg(dev, "%s - expected data: %d\n", __func__, wrexpected);
0196 } else
0197 wrexpected = sizeof(priv->wrbuf);
0198
0199 if (priv->wrfilled >= wrexpected) {
0200
0201 int length;
0202
0203 dev_dbg(dev, "%s - transmitting data (frame 1)\n", __func__);
0204 length = (wrexpected > port->bulk_out_size) ?
0205 port->bulk_out_size : wrexpected;
0206
0207 memcpy(port->write_urb->transfer_buffer, priv->wrbuf, length);
0208 priv->wrsent = length;
0209
0210
0211 port->write_urb->transfer_buffer_length = length;
0212
0213
0214 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
0215 if (result) {
0216 dev_err(&port->dev,
0217 "%s - failed submitting write urb, error %d\n",
0218 __func__, result);
0219
0220 priv->wrfilled = 0;
0221 priv->wrsent = 0;
0222 spin_unlock_irqrestore(&priv->lock, flags);
0223 set_bit(0, &port->write_urbs_free);
0224 return 0;
0225 }
0226
0227 dev_dbg(dev, "%s - priv->wrsent=%d\n", __func__, priv->wrsent);
0228 dev_dbg(dev, "%s - priv->wrfilled=%d\n", __func__, priv->wrfilled);
0229
0230 if (priv->wrsent >= priv->wrfilled) {
0231 dev_dbg(dev, "%s - buffer cleaned\n", __func__);
0232 memset(priv->wrbuf, 0, sizeof(priv->wrbuf));
0233 priv->wrfilled = 0;
0234 priv->wrsent = 0;
0235 }
0236 }
0237
0238 spin_unlock_irqrestore(&priv->lock, flags);
0239
0240 return count;
0241 }
0242
0243 static unsigned int cyberjack_write_room(struct tty_struct *tty)
0244 {
0245
0246 return CYBERJACK_LOCAL_BUF_SIZE;
0247 }
0248
0249 static void cyberjack_read_int_callback(struct urb *urb)
0250 {
0251 struct usb_serial_port *port = urb->context;
0252 struct cyberjack_private *priv = usb_get_serial_port_data(port);
0253 struct device *dev = &port->dev;
0254 unsigned char *data = urb->transfer_buffer;
0255 int status = urb->status;
0256 unsigned long flags;
0257 int result;
0258
0259
0260 if (status)
0261 return;
0262
0263 usb_serial_debug_data(dev, __func__, urb->actual_length, data);
0264
0265
0266 if (urb->actual_length == 4 && data[0] == 0x01) {
0267 short old_rdtodo;
0268
0269
0270 unsigned short size = ((unsigned short)data[3]<<8)+data[2]+3;
0271
0272 spin_lock_irqsave(&priv->lock, flags);
0273
0274 old_rdtodo = priv->rdtodo;
0275
0276 if (old_rdtodo > SHRT_MAX - size) {
0277 dev_dbg(dev, "Too many bulk_in urbs to do.\n");
0278 spin_unlock_irqrestore(&priv->lock, flags);
0279 goto resubmit;
0280 }
0281
0282
0283 priv->rdtodo += size;
0284
0285 dev_dbg(dev, "%s - rdtodo: %d\n", __func__, priv->rdtodo);
0286
0287 spin_unlock_irqrestore(&priv->lock, flags);
0288
0289 if (!old_rdtodo) {
0290 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
0291 if (result)
0292 dev_err(dev, "%s - failed resubmitting read urb, error %d\n",
0293 __func__, result);
0294 dev_dbg(dev, "%s - usb_submit_urb(read urb)\n", __func__);
0295 }
0296 }
0297
0298 resubmit:
0299 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
0300 if (result)
0301 dev_err(&port->dev, "usb_submit_urb(read int) failed\n");
0302 dev_dbg(dev, "%s - usb_submit_urb(int urb)\n", __func__);
0303 }
0304
0305 static void cyberjack_read_bulk_callback(struct urb *urb)
0306 {
0307 struct usb_serial_port *port = urb->context;
0308 struct cyberjack_private *priv = usb_get_serial_port_data(port);
0309 struct device *dev = &port->dev;
0310 unsigned char *data = urb->transfer_buffer;
0311 unsigned long flags;
0312 short todo;
0313 int result;
0314 int status = urb->status;
0315
0316 usb_serial_debug_data(dev, __func__, urb->actual_length, data);
0317 if (status) {
0318 dev_dbg(dev, "%s - nonzero read bulk status received: %d\n",
0319 __func__, status);
0320 return;
0321 }
0322
0323 if (urb->actual_length) {
0324 tty_insert_flip_string(&port->port, data, urb->actual_length);
0325 tty_flip_buffer_push(&port->port);
0326 }
0327
0328 spin_lock_irqsave(&priv->lock, flags);
0329
0330
0331 priv->rdtodo -= urb->actual_length;
0332
0333 if (priv->rdtodo < 0)
0334 priv->rdtodo = 0;
0335 todo = priv->rdtodo;
0336
0337 spin_unlock_irqrestore(&priv->lock, flags);
0338
0339 dev_dbg(dev, "%s - rdtodo: %d\n", __func__, todo);
0340
0341
0342 if (todo ) {
0343 result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
0344 if (result)
0345 dev_err(dev, "%s - failed resubmitting read urb, error %d\n",
0346 __func__, result);
0347 dev_dbg(dev, "%s - usb_submit_urb(read urb)\n", __func__);
0348 }
0349 }
0350
0351 static void cyberjack_write_bulk_callback(struct urb *urb)
0352 {
0353 struct usb_serial_port *port = urb->context;
0354 struct cyberjack_private *priv = usb_get_serial_port_data(port);
0355 struct device *dev = &port->dev;
0356 int status = urb->status;
0357 unsigned long flags;
0358 bool resubmitted = false;
0359
0360 if (status) {
0361 dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
0362 __func__, status);
0363 set_bit(0, &port->write_urbs_free);
0364 return;
0365 }
0366
0367 spin_lock_irqsave(&priv->lock, flags);
0368
0369
0370 if (priv->wrfilled) {
0371 int length, blksize, result;
0372
0373 dev_dbg(dev, "%s - transmitting data (frame n)\n", __func__);
0374
0375 length = ((priv->wrfilled - priv->wrsent) > port->bulk_out_size) ?
0376 port->bulk_out_size : (priv->wrfilled - priv->wrsent);
0377
0378 memcpy(port->write_urb->transfer_buffer,
0379 priv->wrbuf + priv->wrsent, length);
0380 priv->wrsent += length;
0381
0382
0383 port->write_urb->transfer_buffer_length = length;
0384
0385
0386 result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
0387 if (result) {
0388 dev_err(dev, "%s - failed submitting write urb, error %d\n",
0389 __func__, result);
0390
0391 priv->wrfilled = 0;
0392 priv->wrsent = 0;
0393 goto exit;
0394 }
0395
0396 resubmitted = true;
0397
0398 dev_dbg(dev, "%s - priv->wrsent=%d\n", __func__, priv->wrsent);
0399 dev_dbg(dev, "%s - priv->wrfilled=%d\n", __func__, priv->wrfilled);
0400
0401 blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;
0402
0403 if (priv->wrsent >= priv->wrfilled ||
0404 priv->wrsent >= blksize) {
0405 dev_dbg(dev, "%s - buffer cleaned\n", __func__);
0406 memset(priv->wrbuf, 0, sizeof(priv->wrbuf));
0407 priv->wrfilled = 0;
0408 priv->wrsent = 0;
0409 }
0410 }
0411
0412 exit:
0413 spin_unlock_irqrestore(&priv->lock, flags);
0414 if (!resubmitted)
0415 set_bit(0, &port->write_urbs_free);
0416 usb_serial_port_softint(port);
0417 }
0418
0419 module_usb_serial_driver(serial_drivers, id_table);
0420
0421 MODULE_AUTHOR(DRIVER_AUTHOR);
0422 MODULE_DESCRIPTION(DRIVER_DESC);
0423 MODULE_LICENSE("GPL");