0001
0002
0003
0004
0005
0006
0007 #include <linux/kernel.h>
0008 #include <linux/errno.h>
0009 #include <linux/slab.h>
0010 #include <linux/mm.h>
0011 #include <linux/usb.h>
0012
0013 #include "as102_drv.h"
0014 #include "as102_usb_drv.h"
0015 #include "as102_fw.h"
0016
0017 static void as102_usb_disconnect(struct usb_interface *interface);
0018 static int as102_usb_probe(struct usb_interface *interface,
0019 const struct usb_device_id *id);
0020
0021 static int as102_usb_start_stream(struct as102_dev_t *dev);
0022 static void as102_usb_stop_stream(struct as102_dev_t *dev);
0023
0024 static int as102_open(struct inode *inode, struct file *file);
0025 static int as102_release(struct inode *inode, struct file *file);
0026
0027 static const struct usb_device_id as102_usb_id_table[] = {
0028 { USB_DEVICE(AS102_USB_DEVICE_VENDOR_ID, AS102_USB_DEVICE_PID_0001) },
0029 { USB_DEVICE(PCTV_74E_USB_VID, PCTV_74E_USB_PID) },
0030 { USB_DEVICE(ELGATO_EYETV_DTT_USB_VID, ELGATO_EYETV_DTT_USB_PID) },
0031 { USB_DEVICE(NBOX_DVBT_DONGLE_USB_VID, NBOX_DVBT_DONGLE_USB_PID) },
0032 { USB_DEVICE(SKY_IT_DIGITAL_KEY_USB_VID, SKY_IT_DIGITAL_KEY_USB_PID) },
0033 { }
0034 };
0035
0036
0037
0038 static const char * const as102_device_names[] = {
0039 AS102_REFERENCE_DESIGN,
0040 AS102_PCTV_74E,
0041 AS102_ELGATO_EYETV_DTT_NAME,
0042 AS102_NBOX_DVBT_DONGLE_NAME,
0043 AS102_SKY_IT_DIGITAL_KEY_NAME,
0044 NULL
0045 };
0046
0047
0048
0049 static uint8_t const as102_elna_cfg[] = {
0050 0xA0,
0051 0xC0,
0052 0xC0,
0053 0xA0,
0054 0xA0,
0055 0x00
0056 };
0057
0058 struct usb_driver as102_usb_driver = {
0059 .name = DRIVER_FULL_NAME,
0060 .probe = as102_usb_probe,
0061 .disconnect = as102_usb_disconnect,
0062 .id_table = as102_usb_id_table
0063 };
0064
0065 static const struct file_operations as102_dev_fops = {
0066 .owner = THIS_MODULE,
0067 .open = as102_open,
0068 .release = as102_release,
0069 };
0070
0071 static struct usb_class_driver as102_usb_class_driver = {
0072 .name = "aton2-%d",
0073 .fops = &as102_dev_fops,
0074 .minor_base = AS102_DEVICE_MAJOR,
0075 };
0076
0077 static int as102_usb_xfer_cmd(struct as10x_bus_adapter_t *bus_adap,
0078 unsigned char *send_buf, int send_buf_len,
0079 unsigned char *recv_buf, int recv_buf_len)
0080 {
0081 int ret = 0;
0082
0083 if (send_buf != NULL) {
0084 ret = usb_control_msg(bus_adap->usb_dev,
0085 usb_sndctrlpipe(bus_adap->usb_dev, 0),
0086 AS102_USB_DEVICE_TX_CTRL_CMD,
0087 USB_DIR_OUT | USB_TYPE_VENDOR |
0088 USB_RECIP_DEVICE,
0089 bus_adap->cmd_xid,
0090 0,
0091 send_buf, send_buf_len,
0092 USB_CTRL_SET_TIMEOUT );
0093 if (ret < 0) {
0094 dev_dbg(&bus_adap->usb_dev->dev,
0095 "usb_control_msg(send) failed, err %i\n", ret);
0096 return ret;
0097 }
0098
0099 if (ret != send_buf_len) {
0100 dev_dbg(&bus_adap->usb_dev->dev,
0101 "only wrote %d of %d bytes\n", ret, send_buf_len);
0102 return -1;
0103 }
0104 }
0105
0106 if (recv_buf != NULL) {
0107 #ifdef TRACE
0108 dev_dbg(bus_adap->usb_dev->dev,
0109 "want to read: %d bytes\n", recv_buf_len);
0110 #endif
0111 ret = usb_control_msg(bus_adap->usb_dev,
0112 usb_rcvctrlpipe(bus_adap->usb_dev, 0),
0113 AS102_USB_DEVICE_RX_CTRL_CMD,
0114 USB_DIR_IN | USB_TYPE_VENDOR |
0115 USB_RECIP_DEVICE,
0116 bus_adap->cmd_xid,
0117 0,
0118 recv_buf, recv_buf_len,
0119 USB_CTRL_GET_TIMEOUT );
0120 if (ret < 0) {
0121 dev_dbg(&bus_adap->usb_dev->dev,
0122 "usb_control_msg(recv) failed, err %i\n", ret);
0123 return ret;
0124 }
0125 #ifdef TRACE
0126 dev_dbg(bus_adap->usb_dev->dev,
0127 "read %d bytes\n", recv_buf_len);
0128 #endif
0129 }
0130
0131 return ret;
0132 }
0133
0134 static int as102_send_ep1(struct as10x_bus_adapter_t *bus_adap,
0135 unsigned char *send_buf,
0136 int send_buf_len,
0137 int swap32)
0138 {
0139 int ret, actual_len;
0140
0141 ret = usb_bulk_msg(bus_adap->usb_dev,
0142 usb_sndbulkpipe(bus_adap->usb_dev, 1),
0143 send_buf, send_buf_len, &actual_len, 200);
0144 if (ret) {
0145 dev_dbg(&bus_adap->usb_dev->dev,
0146 "usb_bulk_msg(send) failed, err %i\n", ret);
0147 return ret;
0148 }
0149
0150 if (actual_len != send_buf_len) {
0151 dev_dbg(&bus_adap->usb_dev->dev, "only wrote %d of %d bytes\n",
0152 actual_len, send_buf_len);
0153 return -1;
0154 }
0155 return actual_len;
0156 }
0157
0158 static int as102_read_ep2(struct as10x_bus_adapter_t *bus_adap,
0159 unsigned char *recv_buf, int recv_buf_len)
0160 {
0161 int ret, actual_len;
0162
0163 if (recv_buf == NULL)
0164 return -EINVAL;
0165
0166 ret = usb_bulk_msg(bus_adap->usb_dev,
0167 usb_rcvbulkpipe(bus_adap->usb_dev, 2),
0168 recv_buf, recv_buf_len, &actual_len, 200);
0169 if (ret) {
0170 dev_dbg(&bus_adap->usb_dev->dev,
0171 "usb_bulk_msg(recv) failed, err %i\n", ret);
0172 return ret;
0173 }
0174
0175 if (actual_len != recv_buf_len) {
0176 dev_dbg(&bus_adap->usb_dev->dev, "only read %d of %d bytes\n",
0177 actual_len, recv_buf_len);
0178 return -1;
0179 }
0180 return actual_len;
0181 }
0182
0183 static const struct as102_priv_ops_t as102_priv_ops = {
0184 .upload_fw_pkt = as102_send_ep1,
0185 .xfer_cmd = as102_usb_xfer_cmd,
0186 .as102_read_ep2 = as102_read_ep2,
0187 .start_stream = as102_usb_start_stream,
0188 .stop_stream = as102_usb_stop_stream,
0189 };
0190
0191 static int as102_submit_urb_stream(struct as102_dev_t *dev, struct urb *urb)
0192 {
0193 int err;
0194
0195 usb_fill_bulk_urb(urb,
0196 dev->bus_adap.usb_dev,
0197 usb_rcvbulkpipe(dev->bus_adap.usb_dev, 0x2),
0198 urb->transfer_buffer,
0199 AS102_USB_BUF_SIZE,
0200 as102_urb_stream_irq,
0201 dev);
0202
0203 err = usb_submit_urb(urb, GFP_ATOMIC);
0204 if (err)
0205 dev_dbg(&urb->dev->dev,
0206 "%s: usb_submit_urb failed\n", __func__);
0207
0208 return err;
0209 }
0210
0211 void as102_urb_stream_irq(struct urb *urb)
0212 {
0213 struct as102_dev_t *as102_dev = urb->context;
0214
0215 if (urb->actual_length > 0) {
0216 dvb_dmx_swfilter(&as102_dev->dvb_dmx,
0217 urb->transfer_buffer,
0218 urb->actual_length);
0219 } else {
0220 if (urb->actual_length == 0)
0221 memset(urb->transfer_buffer, 0, AS102_USB_BUF_SIZE);
0222 }
0223
0224
0225 if (as102_dev->streaming)
0226 as102_submit_urb_stream(as102_dev, urb);
0227 }
0228
0229 static void as102_free_usb_stream_buffer(struct as102_dev_t *dev)
0230 {
0231 int i;
0232
0233 for (i = 0; i < MAX_STREAM_URB; i++)
0234 usb_free_urb(dev->stream_urb[i]);
0235
0236 usb_free_coherent(dev->bus_adap.usb_dev,
0237 MAX_STREAM_URB * AS102_USB_BUF_SIZE,
0238 dev->stream,
0239 dev->dma_addr);
0240 }
0241
0242 static int as102_alloc_usb_stream_buffer(struct as102_dev_t *dev)
0243 {
0244 int i;
0245
0246 dev->stream = usb_alloc_coherent(dev->bus_adap.usb_dev,
0247 MAX_STREAM_URB * AS102_USB_BUF_SIZE,
0248 GFP_KERNEL,
0249 &dev->dma_addr);
0250 if (!dev->stream) {
0251 dev_dbg(&dev->bus_adap.usb_dev->dev,
0252 "%s: usb_buffer_alloc failed\n", __func__);
0253 return -ENOMEM;
0254 }
0255
0256 memset(dev->stream, 0, MAX_STREAM_URB * AS102_USB_BUF_SIZE);
0257
0258
0259 for (i = 0; i < MAX_STREAM_URB; i++) {
0260 struct urb *urb;
0261
0262 urb = usb_alloc_urb(0, GFP_ATOMIC);
0263 if (urb == NULL) {
0264 as102_free_usb_stream_buffer(dev);
0265 return -ENOMEM;
0266 }
0267
0268 urb->transfer_buffer = dev->stream + (i * AS102_USB_BUF_SIZE);
0269 urb->transfer_dma = dev->dma_addr + (i * AS102_USB_BUF_SIZE);
0270 urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
0271 urb->transfer_buffer_length = AS102_USB_BUF_SIZE;
0272
0273 dev->stream_urb[i] = urb;
0274 }
0275 return 0;
0276 }
0277
0278 static void as102_usb_stop_stream(struct as102_dev_t *dev)
0279 {
0280 int i;
0281
0282 for (i = 0; i < MAX_STREAM_URB; i++)
0283 usb_kill_urb(dev->stream_urb[i]);
0284 }
0285
0286 static int as102_usb_start_stream(struct as102_dev_t *dev)
0287 {
0288 int i, ret = 0;
0289
0290 for (i = 0; i < MAX_STREAM_URB; i++) {
0291 ret = as102_submit_urb_stream(dev, dev->stream_urb[i]);
0292 if (ret) {
0293 as102_usb_stop_stream(dev);
0294 return ret;
0295 }
0296 }
0297
0298 return 0;
0299 }
0300
0301 static void as102_usb_release(struct kref *kref)
0302 {
0303 struct as102_dev_t *as102_dev;
0304
0305 as102_dev = container_of(kref, struct as102_dev_t, kref);
0306 if (as102_dev != NULL) {
0307 usb_put_dev(as102_dev->bus_adap.usb_dev);
0308 kfree(as102_dev);
0309 }
0310 }
0311
0312 static void as102_usb_disconnect(struct usb_interface *intf)
0313 {
0314 struct as102_dev_t *as102_dev;
0315
0316
0317 as102_dev = usb_get_intfdata(intf);
0318
0319
0320 as102_dvb_unregister(as102_dev);
0321
0322
0323 as102_free_usb_stream_buffer(as102_dev);
0324
0325 usb_set_intfdata(intf, NULL);
0326
0327
0328 usb_deregister_dev(intf, &as102_usb_class_driver);
0329
0330
0331 kref_put(&as102_dev->kref, as102_usb_release);
0332
0333 pr_info("%s: device has been disconnected\n", DRIVER_NAME);
0334 }
0335
0336 static int as102_usb_probe(struct usb_interface *intf,
0337 const struct usb_device_id *id)
0338 {
0339 int ret;
0340 struct as102_dev_t *as102_dev;
0341 int i;
0342
0343
0344 if (ARRAY_SIZE(as102_usb_id_table) !=
0345 (sizeof(as102_device_names) / sizeof(const char *))) {
0346 pr_err("Device names table invalid size");
0347 return -EINVAL;
0348 }
0349
0350 as102_dev = kzalloc(sizeof(struct as102_dev_t), GFP_KERNEL);
0351 if (as102_dev == NULL)
0352 return -ENOMEM;
0353
0354
0355 for (i = 0; i < ARRAY_SIZE(as102_usb_id_table); i++) {
0356 if (id == &as102_usb_id_table[i]) {
0357 as102_dev->name = as102_device_names[i];
0358 as102_dev->elna_cfg = as102_elna_cfg[i];
0359 }
0360 }
0361
0362 if (as102_dev->name == NULL)
0363 as102_dev->name = "Unknown AS102 device";
0364
0365
0366 as102_dev->bus_adap.ops = &as102_priv_ops;
0367
0368
0369 as102_dev->bus_adap.cmd = &as102_dev->bus_adap.token.usb.c;
0370 as102_dev->bus_adap.rsp = &as102_dev->bus_adap.token.usb.r;
0371
0372
0373 kref_init(&as102_dev->kref);
0374
0375
0376 usb_set_intfdata(intf, (void *) as102_dev);
0377
0378
0379 as102_dev->bus_adap.usb_dev = usb_get_dev(interface_to_usbdev(intf));
0380
0381
0382 ret = usb_register_dev(intf, &as102_usb_class_driver);
0383 if (ret < 0) {
0384
0385 dev_err(&intf->dev,
0386 "%s: usb_register_dev() failed (errno = %d)\n",
0387 __func__, ret);
0388 goto failed;
0389 }
0390
0391 pr_info("%s: device has been detected\n", DRIVER_NAME);
0392
0393
0394 ret = as102_alloc_usb_stream_buffer(as102_dev);
0395 if (ret != 0)
0396 goto failed_stream;
0397
0398
0399 ret = as102_dvb_register(as102_dev);
0400 if (ret != 0)
0401 goto failed_dvb;
0402
0403 return ret;
0404
0405 failed_dvb:
0406 as102_free_usb_stream_buffer(as102_dev);
0407 failed_stream:
0408 usb_deregister_dev(intf, &as102_usb_class_driver);
0409 failed:
0410 usb_put_dev(as102_dev->bus_adap.usb_dev);
0411 usb_set_intfdata(intf, NULL);
0412 kfree(as102_dev);
0413 return ret;
0414 }
0415
0416 static int as102_open(struct inode *inode, struct file *file)
0417 {
0418 int ret = 0, minor = 0;
0419 struct usb_interface *intf = NULL;
0420 struct as102_dev_t *dev = NULL;
0421
0422
0423 minor = iminor(inode);
0424
0425
0426 intf = usb_find_interface(&as102_usb_driver, minor);
0427 if (intf == NULL) {
0428 pr_err("%s: can't find device for minor %d\n",
0429 __func__, minor);
0430 ret = -ENODEV;
0431 goto exit;
0432 }
0433
0434
0435 dev = usb_get_intfdata(intf);
0436 if (dev == NULL) {
0437 ret = -EFAULT;
0438 goto exit;
0439 }
0440
0441
0442 file->private_data = dev;
0443
0444
0445 kref_get(&dev->kref);
0446
0447 exit:
0448 return ret;
0449 }
0450
0451 static int as102_release(struct inode *inode, struct file *file)
0452 {
0453 struct as102_dev_t *dev = NULL;
0454
0455 dev = file->private_data;
0456 if (dev != NULL) {
0457
0458 kref_put(&dev->kref, as102_usb_release);
0459 }
0460
0461 return 0;
0462 }
0463
0464 MODULE_DEVICE_TABLE(usb, as102_usb_id_table);