Message ID | 1316514677.5199.85.camel@Doron-Ubuntu (mailing list archive) |
---|---|
State | Rejected, archived |
Headers |
Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from <linux-media-owner@vger.kernel.org>) id 1R5xPT-0002qm-9H; Tue, 20 Sep 2011 12:18:40 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-1) with esmtp id 1R5xPS-0004cv-Jl; Tue, 20 Sep 2011 12:18:39 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755270Ab1ITKSg (ORCPT <rfc822;patchwork@linuxtv.org> + 5 others); Tue, 20 Sep 2011 06:18:36 -0400 Received: from mr.siano-ms.com ([62.0.79.70]:6231 "EHLO Siano-NV.ser.netvision.net.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755070Ab1ITKSf convert rfc822-to-8bit (ORCPT <rfc822;linux-media@vger.kernel.org>); Tue, 20 Sep 2011 06:18:35 -0400 Received: from 172.20.9.6 ([172.20.9.6]) by s-mail.siano-ms.ent ([172.20.1.2]) with Microsoft Exchange Server HTTP-DAV ; Tue, 20 Sep 2011 10:20:04 +0000 Received: from Doron-Ubuntu by S-MAIL; 20 Sep 2011 13:31:18 +0300 Subject: [PATCH 7/17]DVB:Siano drivers - Support flexiable usb endpoint rather than hard-cored numbers. From: Doron Cohen <doronc@siano-ms.com> Reply-To: doronc@siano-ms.com To: linux-media@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Organization: Siano Mobile Silicon Date: Tue, 20 Sep 2011 13:31:17 +0300 Message-ID: <1316514677.5199.85.camel@Doron-Ubuntu> Mime-Version: 1.0 X-Mailer: Evolution 2.32.2 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2011.9.20.100915 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MSGID_ADDED_BY_MTA 0.05, BODY_SIZE_10000_PLUS 0, INVALID_MSGID_NO_FQDN 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __CT 0, __CTE 0, __CT_TEXT_PLAIN 0, __DATE_TZ_RU 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __SANE_MSGID 0, __STOCK_PHRASE_7 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NS ' X-LSpam-Score: 1.0 (+) X-LSpam-Report: No, score=1.0 required=5.0 tests=BAYES_00=-1.9, KB_DATE_CONTAINS_TAB=2.751, RCVD_IN_DNSWL_MED=-2.3, TAB_IN_FROM=2.494 autolearn=no |
Commit Message
Doron Cohen
Sept. 20, 2011, 10:31 a.m. UTC
Hi,
This patch changes the usb driver to support flexiable usb endpoint
rather than hard-cored numbers.
Thanks,
Doron Cohen
--------------
From e4134fa357d3f41476b8ff33ebbcb69c399641dc Mon Sep 17 00:00:00 2001
From: Doron Cohen <doronc@siano-ms.com>
Date: Mon, 19 Sep 2011 13:58:43 +0300
Subject: [PATCH 10/21] Support flexible endpoint numbering for various
SMS devices 9instead of hard coded values)
---
drivers/media/dvb/siano/smsusb.c | 240
+++++++++++++++++++++++--------------
1 files changed, 149 insertions(+), 91 deletions(-)
};
@@ -54,13 +126,26 @@ struct smsusb_device_t {
struct smsusb_urb_t surbs[MAX_URBS];
- int response_alignment;
- int buffer_size;
+ int response_alignment;
+ int buffer_size;
+ unsigned char in_ep;
+ unsigned char out_ep;
+ enum smsusb_state state;
};
static int smsusb_submit_urb(struct smsusb_device_t *dev,
struct smsusb_urb_t *surb);
+/**
+ * Completing URB's callback handler - top half (interrupt context)
+
+ * adds completing sms urb to the global surbs list and activtes the
worker
+ * thread the surb
+ * IMPORTANT - blocking functions must not be called from here !!!
+
+ * @param urb pointer to a completing urb object
+ */
+
static void smsusb_onresponse(struct urb *urb)
{
struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context;
@@ -121,6 +206,7 @@ exit_and_resubmit:
smsusb_submit_urb(dev, surb);
}
+
static int smsusb_submit_urb(struct smsusb_device_t *dev,
struct smsusb_urb_t *surb)
{
@@ -135,7 +221,7 @@ static int smsusb_submit_urb(struct smsusb_device_t
*dev,
usb_fill_bulk_urb(
&surb->urb,
dev->udev,
- usb_rcvbulkpipe(dev->udev, 0x81),
+ usb_rcvbulkpipe(dev->udev, dev->in_ep),
surb->cb->p,
dev->buffer_size,
smsusb_onresponse,
@@ -182,6 +268,9 @@ static int smsusb_sendrequest(void *context, void
*buffer, size_t size)
struct smsusb_device_t *dev = (struct smsusb_device_t *) context;
int dummy;
+ if (dev->state != SMSUSB_ACTIVE)
+ return -ENOENT;
+
smsendian_handle_message_header((struct SmsMsgHdr_S *)buffer);
return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2),
buffer, size, &dummy, 1000);
@@ -291,15 +380,16 @@ static void smsusb_term_device(struct
usb_interface *intf)
struct smsusb_device_t *dev = usb_get_intfdata(intf);
if (dev) {
+ dev->state = SMSUSB_DISCONNECTED;
+
smsusb_stop_streaming(dev);
/* unregister from smscore */
if (dev->coredev)
smscore_unregister_device(dev->coredev);
+ sms_info("device 0x%p destroyed", dev);
kfree(dev);
-
- sms_info("device %p destroyed", dev);
}
usb_set_intfdata(intf, NULL);
@@ -321,6 +411,7 @@ static int smsusb_init_device(struct usb_interface
*intf, int board_id)
memset(¶ms, 0, sizeof(params));
usb_set_intfdata(intf, dev);
dev->udev = interface_to_usbdev(intf);
+ dev->state = SMSUSB_DISCONNECTED;
params.device_type = sms_get_board(board_id)->type;
@@ -337,6 +428,8 @@ static int smsusb_init_device(struct usb_interface
*intf, int board_id)
case SMS_NOVA_A0:
case SMS_NOVA_B0:
case SMS_VEGA:
+ case SMS_VENICE:
+ case SMS_DENVER_1530:
dev->buffer_size = USB2_BUFFER_SIZE;
dev->response_alignment =
le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
@@ -346,6 +439,18 @@ static int smsusb_init_device(struct usb_interface
*intf, int board_id)
break;
}
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
+ if (intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress & USB_DIR_IN)
+ dev->in_ep = intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress;
+ else
+ dev->out_ep = intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress;
+
+ sms_info("in_ep = %02x, out_ep = %02x",
+ dev->in_ep, dev->out_ep);
+
params.device = &dev->udev->dev;
params.buffer_size = dev->buffer_size;
params.num_buffers = MAX_BUFFERS;
@@ -377,6 +482,8 @@ static int smsusb_init_device(struct usb_interface
*intf, int board_id)
return rc;
}
+ dev->state = SMSUSB_ACTIVE;
+
rc = smscore_start_device(dev->coredev);
if (rc < 0) {
sms_err("smscore_start_device(...) failed");
@@ -384,7 +491,7 @@ static int smsusb_init_device(struct usb_interface
*intf, int board_id)
return rc;
}
- sms_info("device %p created", dev);
+ sms_info("device 0x%p created", dev);
return rc;
}
@@ -396,12 +503,21 @@ static int __devinit smsusb_probe(struct
usb_interface *intf,
char devpath[32];
int i, rc;
- rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
- rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
+ sms_info("interface number %d",
+ intf->cur_altsetting->desc.bInterfaceNumber);
- if (intf->num_altsetting > 0) {
- rc = usb_set_interface(
- udev, intf->cur_altsetting->desc.bInterfaceNumber, 0);
+ if (sms_get_board(id->driver_info)->intf_num !=
+ intf->cur_altsetting->desc.bInterfaceNumber) {
+ sms_err("interface number is %d expecting %d",
+ sms_get_board(id->driver_info)->intf_num,
+ intf->cur_altsetting->desc.bInterfaceNumber);
+ return -ENODEV;
+ }
+
+ if (intf->num_altsetting > 1) {
+ rc = usb_set_interface(udev,
+ intf->cur_altsetting->desc.
+ bInterfaceNumber, 0);
if (rc < 0) {
sms_err("usb_set_interface failed, rc %d", rc);
return rc;
@@ -411,18 +527,24 @@ static int __devinit smsusb_probe(struct
usb_interface *intf,
sms_info("smsusb_probe %d",
intf->cur_altsetting->desc.bInterfaceNumber);
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
+ {
sms_info("endpoint %d %02x %02x %d", i,
intf->cur_altsetting->endpoint[i].desc.bEndpointAddress,
intf->cur_altsetting->endpoint[i].desc.bmAttributes,
intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
-
- if ((udev->actconfig->desc.bNumInterfaces == 2) &&
- (intf->cur_altsetting->desc.bInterfaceNumber == 0)) {
- sms_err("rom interface 0 is not used");
- return -ENODEV;
+ if (intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress & USB_DIR_IN)
+ rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev,
+ intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress));
+ else
+ rc = usb_clear_halt(udev, usb_sndbulkpipe(udev,
+ intf->cur_altsetting->endpoint[i].desc.
+ bEndpointAddress));
}
- if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
+ if (id->driver_info == SMS1XXX_BOARD_SIANO_STELLAR_ROM) {
+ sms_info("stellar device was found.");
snprintf(devpath, sizeof(devpath), "usb\\%d-%s",
udev->bus->busnum, udev->devpath);
sms_info("stellar device was found.");
@@ -445,7 +567,9 @@ static void smsusb_disconnect(struct usb_interface
*intf)
static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
{
struct smsusb_device_t *dev = usb_get_intfdata(intf);
- printk(KERN_INFO "%s: Entering status %d.\n", __func__, msg.event);
+ printk(KERN_INFO "%s Entering status %d.\n", __func__, msg.event);
+ dev->state = SMSUSB_SUSPENDED;
+ /*smscore_set_power_mode(dev, SMS_POWER_MODE_SUSPENDED);*/
smsusb_stop_streaming(dev);
return 0;
}
@@ -457,8 +581,8 @@ static int smsusb_resume(struct usb_interface *intf)
struct usb_device *udev = interface_to_usbdev(intf);
printk(KERN_INFO "%s: Entering.\n", __func__);
- usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
- usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
+ usb_clear_halt(udev, usb_rcvbulkpipe(udev, dev->in_ep));
+ usb_clear_halt(udev, usb_sndbulkpipe(udev, dev->out_ep));
for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
printk(KERN_INFO "endpoint %d %02x %02x %d\n", i,
@@ -481,72 +605,6 @@ static int smsusb_resume(struct usb_interface
*intf)
return 0;
}
-static const struct usb_device_id smsusb_id_table[] __devinitconst = {
- { USB_DEVICE(0x187f, 0x0010),
- .driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
- { USB_DEVICE(0x187f, 0x0100),
- .driver_info = SMS1XXX_BOARD_SIANO_STELLAR },
- { USB_DEVICE(0x187f, 0x0200),
- .driver_info = SMS1XXX_BOARD_SIANO_NOVA_A },
- { USB_DEVICE(0x187f, 0x0201),
- .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B },
- { USB_DEVICE(0x187f, 0x0300),
- .driver_info = SMS1XXX_BOARD_SIANO_VEGA },
- { USB_DEVICE(0x2040, 0x1700),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT },
- { USB_DEVICE(0x2040, 0x1800),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A },
- { USB_DEVICE(0x2040, 0x1801),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B },
- { USB_DEVICE(0x2040, 0x2000),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
- { USB_DEVICE(0x2040, 0x2009),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 },
- { USB_DEVICE(0x2040, 0x200a),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
- { USB_DEVICE(0x2040, 0x2010),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
- { USB_DEVICE(0x2040, 0x2011),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
- { USB_DEVICE(0x2040, 0x2019),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD },
- { USB_DEVICE(0x2040, 0x5500),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0x5510),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0x5520),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0x5530),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0x5580),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0x5590),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x187f, 0x0202),
- .driver_info = SMS1XXX_BOARD_SIANO_NICE },
- { USB_DEVICE(0x187f, 0x0301),
- .driver_info = SMS1XXX_BOARD_SIANO_VENICE },
- { USB_DEVICE(0x2040, 0xb900),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xb910),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xb980),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xb990),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xc000),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xc010),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xc080),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { USB_DEVICE(0x2040, 0xc090),
- .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
- { } /* Terminating entry */
- };
-
-MODULE_DEVICE_TABLE(usb, smsusb_id_table);
-
static struct usb_driver smsusb_driver = {
.name = "smsusb",
.probe = smsusb_probe,
Comments
Em 20-09-2011 07:31, Doron Cohen escreveu: > Hi, > This patch changes the usb driver to support flexiable usb endpoint > rather than hard-cored numbers. Also looked ok, except for the whitespace mangling. > > Thanks, > Doron Cohen > > -------------- > > > >>From e4134fa357d3f41476b8ff33ebbcb69c399641dc Mon Sep 17 00:00:00 2001 > From: Doron Cohen <doronc@siano-ms.com> > Date: Mon, 19 Sep 2011 13:58:43 +0300 > Subject: [PATCH 10/21] Support flexible endpoint numbering for various > SMS devices 9instead of hard coded values) > > --- > drivers/media/dvb/siano/smsusb.c | 240 > +++++++++++++++++++++++-------------- > 1 files changed, 149 insertions(+), 91 deletions(-) > > diff --git a/drivers/media/dvb/siano/smsusb.c > b/drivers/media/dvb/siano/smsusb.c > index b1c38a2..d7ef147 100644 > --- a/drivers/media/dvb/siano/smsusb.c > +++ b/drivers/media/dvb/siano/smsusb.c > @@ -2,7 +2,7 @@ > > Siano Mobile Silicon, Inc. > MDTV receiver kernel modules. > -Copyright (C) 2005-2009, Uri Shkolnik, Anatoly Greenblat > +Copyright (C) 2006-2011, Doron Cohen Cohen > > This program is free software: you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by > @@ -29,21 +29,93 @@ along with this program. If not, see > <http://www.gnu.org/licenses/>. > #include "sms-cards.h" > #include "smsendian.h" > > -static int sms_dbg; > -module_param_named(debug, sms_dbg, int, 0644); > +int sms_debug; > +module_param_named(debug, sms_debug, int, 0644); > MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))"); > > #define USB1_BUFFER_SIZE 0x1000 > -#define USB2_BUFFER_SIZE 0x4000 > +#define USB2_BUFFER_SIZE 0x2000 > > #define MAX_BUFFERS 50 > #define MAX_URBS 10 > > + > +struct usb_device_id smsusb_id_table[] = { > + { USB_DEVICE(0x187f, 0x0010), > + .driver_info = SMS1XXX_BOARD_SIANO_STELLAR_ROM }, > + { USB_DEVICE(0x187f, 0x0100), > + .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, > + { USB_DEVICE(0x187f, 0x0200), > + .driver_info = SMS1XXX_BOARD_SIANO_NOVA_A }, > + { USB_DEVICE(0x187f, 0x0201), > + .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B }, > + { USB_DEVICE(0x187f, 0x0300), > + .driver_info = SMS1XXX_BOARD_SIANO_VEGA }, > + { USB_DEVICE(0x2040, 0x1700), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT }, > + { USB_DEVICE(0x2040, 0x1800), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A }, > + { USB_DEVICE(0x2040, 0x1801), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B }, > + { USB_DEVICE(0x2040, 0x2000), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > + { USB_DEVICE(0x2040, 0x2009), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 }, > + { USB_DEVICE(0x2040, 0x200a), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > + { USB_DEVICE(0x2040, 0x2010), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > + { USB_DEVICE(0x2040, 0x2019), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > + { USB_DEVICE(0x2040, 0x5500), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x2040, 0x5510), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x2040, 0x5520), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x2040, 0x5530), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x2040, 0x5580), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x2040, 0x5590), > + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > + { USB_DEVICE(0x187f, 0x0202), > + .driver_info = SMS1XXX_BOARD_SIANO_NICE }, > + { USB_DEVICE(0x187f, 0x0301), > + .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, > + { USB_DEVICE(0x187f, 0x0302), > + .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, > + { USB_DEVICE(0x187f, 0x0310), > + .driver_info = SMS1XXX_BOARD_SIANO_MING }, > + { USB_DEVICE(0x187f, 0x0500), > + .driver_info = SMS1XXX_BOARD_SIANO_PELE }, > + { USB_DEVICE(0x187f, 0x0600), > + .driver_info = SMS1XXX_BOARD_SIANO_RIO }, > + { USB_DEVICE(0x187f, 0x0700), > + .driver_info = SMS1XXX_BOARD_SIANO_DENVER_2160 }, > + { USB_DEVICE(0x187f, 0x0800), > + .driver_info = SMS1XXX_BOARD_SIANO_DENVER_1530 }, > + { USB_DEVICE(0x19D2, 0x0086), > + .driver_info = SMS1XXX_BOARD_ZTE_DVB_DATA_CARD }, > + { USB_DEVICE(0x19D2, 0x0078), > + .driver_info = SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD }, > + { } /* Terminating entry */ > + }; > + > +MODULE_DEVICE_TABLE(usb, smsusb_id_table); > + > +enum smsusb_state { > + SMSUSB_DISCONNECTED, > + SMSUSB_SUSPENDED, > + SMSUSB_ACTIVE > +}; > + > struct smsusb_device_t; > > struct smsusb_urb_t { > + struct list_head entry; > struct smscore_buffer_t *cb; > - struct smsusb_device_t *dev; > + struct smsusb_device_t *dev; > > struct urb urb; > }; > @@ -54,13 +126,26 @@ struct smsusb_device_t { > > struct smsusb_urb_t surbs[MAX_URBS]; > > - int response_alignment; > - int buffer_size; > + int response_alignment; > + int buffer_size; > + unsigned char in_ep; > + unsigned char out_ep; > + enum smsusb_state state; > }; > > static int smsusb_submit_urb(struct smsusb_device_t *dev, > struct smsusb_urb_t *surb); > > +/** > + * Completing URB's callback handler - top half (interrupt context) > + > + * adds completing sms urb to the global surbs list and activtes the > worker > + * thread the surb > + * IMPORTANT - blocking functions must not be called from here !!! > + > + * @param urb pointer to a completing urb object > + */ > + > static void smsusb_onresponse(struct urb *urb) > { > struct smsusb_urb_t *surb = (struct smsusb_urb_t *) urb->context; > @@ -121,6 +206,7 @@ exit_and_resubmit: > smsusb_submit_urb(dev, surb); > } > > + > static int smsusb_submit_urb(struct smsusb_device_t *dev, > struct smsusb_urb_t *surb) > { > @@ -135,7 +221,7 @@ static int smsusb_submit_urb(struct smsusb_device_t > *dev, > usb_fill_bulk_urb( > &surb->urb, > dev->udev, > - usb_rcvbulkpipe(dev->udev, 0x81), > + usb_rcvbulkpipe(dev->udev, dev->in_ep), > surb->cb->p, > dev->buffer_size, > smsusb_onresponse, > @@ -182,6 +268,9 @@ static int smsusb_sendrequest(void *context, void > *buffer, size_t size) > struct smsusb_device_t *dev = (struct smsusb_device_t *) context; > int dummy; > > + if (dev->state != SMSUSB_ACTIVE) > + return -ENOENT; > + > smsendian_handle_message_header((struct SmsMsgHdr_S *)buffer); > return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), > buffer, size, &dummy, 1000); > @@ -291,15 +380,16 @@ static void smsusb_term_device(struct > usb_interface *intf) > struct smsusb_device_t *dev = usb_get_intfdata(intf); > > if (dev) { > + dev->state = SMSUSB_DISCONNECTED; > + > smsusb_stop_streaming(dev); > > /* unregister from smscore */ > if (dev->coredev) > smscore_unregister_device(dev->coredev); > > + sms_info("device 0x%p destroyed", dev); > kfree(dev); > - > - sms_info("device %p destroyed", dev); > } > > usb_set_intfdata(intf, NULL); > @@ -321,6 +411,7 @@ static int smsusb_init_device(struct usb_interface > *intf, int board_id) > memset(¶ms, 0, sizeof(params)); > usb_set_intfdata(intf, dev); > dev->udev = interface_to_usbdev(intf); > + dev->state = SMSUSB_DISCONNECTED; > > params.device_type = sms_get_board(board_id)->type; > > @@ -337,6 +428,8 @@ static int smsusb_init_device(struct usb_interface > *intf, int board_id) > case SMS_NOVA_A0: > case SMS_NOVA_B0: > case SMS_VEGA: > + case SMS_VENICE: > + case SMS_DENVER_1530: > dev->buffer_size = USB2_BUFFER_SIZE; > dev->response_alignment = > le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) - > @@ -346,6 +439,18 @@ static int smsusb_init_device(struct usb_interface > *intf, int board_id) > break; > } > > + for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) > + if (intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress & USB_DIR_IN) > + dev->in_ep = intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress; > + else > + dev->out_ep = intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress; > + > + sms_info("in_ep = %02x, out_ep = %02x", > + dev->in_ep, dev->out_ep); > + > params.device = &dev->udev->dev; > params.buffer_size = dev->buffer_size; > params.num_buffers = MAX_BUFFERS; > @@ -377,6 +482,8 @@ static int smsusb_init_device(struct usb_interface > *intf, int board_id) > return rc; > } > > + dev->state = SMSUSB_ACTIVE; > + > rc = smscore_start_device(dev->coredev); > if (rc < 0) { > sms_err("smscore_start_device(...) failed"); > @@ -384,7 +491,7 @@ static int smsusb_init_device(struct usb_interface > *intf, int board_id) > return rc; > } > > - sms_info("device %p created", dev); > + sms_info("device 0x%p created", dev); > > return rc; > } > @@ -396,12 +503,21 @@ static int __devinit smsusb_probe(struct > usb_interface *intf, > char devpath[32]; > int i, rc; > > - rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81)); > - rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02)); > + sms_info("interface number %d", > + intf->cur_altsetting->desc.bInterfaceNumber); > > - if (intf->num_altsetting > 0) { > - rc = usb_set_interface( > - udev, intf->cur_altsetting->desc.bInterfaceNumber, 0); > + if (sms_get_board(id->driver_info)->intf_num != > + intf->cur_altsetting->desc.bInterfaceNumber) { > + sms_err("interface number is %d expecting %d", > + sms_get_board(id->driver_info)->intf_num, > + intf->cur_altsetting->desc.bInterfaceNumber); > + return -ENODEV; > + } > + > + if (intf->num_altsetting > 1) { > + rc = usb_set_interface(udev, > + intf->cur_altsetting->desc. > + bInterfaceNumber, 0); > if (rc < 0) { > sms_err("usb_set_interface failed, rc %d", rc); > return rc; > @@ -411,18 +527,24 @@ static int __devinit smsusb_probe(struct > usb_interface *intf, > sms_info("smsusb_probe %d", > intf->cur_altsetting->desc.bInterfaceNumber); > for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) > + { > sms_info("endpoint %d %02x %02x %d", i, > intf->cur_altsetting->endpoint[i].desc.bEndpointAddress, > intf->cur_altsetting->endpoint[i].desc.bmAttributes, > intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize); > - > - if ((udev->actconfig->desc.bNumInterfaces == 2) && > - (intf->cur_altsetting->desc.bInterfaceNumber == 0)) { > - sms_err("rom interface 0 is not used"); > - return -ENODEV; > + if (intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress & USB_DIR_IN) > + rc = usb_clear_halt(udev, usb_rcvbulkpipe(udev, > + intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress)); > + else > + rc = usb_clear_halt(udev, usb_sndbulkpipe(udev, > + intf->cur_altsetting->endpoint[i].desc. > + bEndpointAddress)); > } > > - if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { > + if (id->driver_info == SMS1XXX_BOARD_SIANO_STELLAR_ROM) { > + sms_info("stellar device was found."); > snprintf(devpath, sizeof(devpath), "usb\\%d-%s", > udev->bus->busnum, udev->devpath); > sms_info("stellar device was found."); > @@ -445,7 +567,9 @@ static void smsusb_disconnect(struct usb_interface > *intf) > static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg) > { > struct smsusb_device_t *dev = usb_get_intfdata(intf); > - printk(KERN_INFO "%s: Entering status %d.\n", __func__, msg.event); > + printk(KERN_INFO "%s Entering status %d.\n", __func__, msg.event); > + dev->state = SMSUSB_SUSPENDED; > + /*smscore_set_power_mode(dev, SMS_POWER_MODE_SUSPENDED);*/ > smsusb_stop_streaming(dev); > return 0; > } > @@ -457,8 +581,8 @@ static int smsusb_resume(struct usb_interface *intf) > struct usb_device *udev = interface_to_usbdev(intf); > > printk(KERN_INFO "%s: Entering.\n", __func__); > - usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81)); > - usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02)); > + usb_clear_halt(udev, usb_rcvbulkpipe(udev, dev->in_ep)); > + usb_clear_halt(udev, usb_sndbulkpipe(udev, dev->out_ep)); > > for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) > printk(KERN_INFO "endpoint %d %02x %02x %d\n", i, > @@ -481,72 +605,6 @@ static int smsusb_resume(struct usb_interface > *intf) > return 0; > } > > -static const struct usb_device_id smsusb_id_table[] __devinitconst = { > - { USB_DEVICE(0x187f, 0x0010), > - .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, > - { USB_DEVICE(0x187f, 0x0100), > - .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, > - { USB_DEVICE(0x187f, 0x0200), > - .driver_info = SMS1XXX_BOARD_SIANO_NOVA_A }, > - { USB_DEVICE(0x187f, 0x0201), > - .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B }, > - { USB_DEVICE(0x187f, 0x0300), > - .driver_info = SMS1XXX_BOARD_SIANO_VEGA }, > - { USB_DEVICE(0x2040, 0x1700), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT }, > - { USB_DEVICE(0x2040, 0x1800), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A }, > - { USB_DEVICE(0x2040, 0x1801), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B }, > - { USB_DEVICE(0x2040, 0x2000), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > - { USB_DEVICE(0x2040, 0x2009), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 }, > - { USB_DEVICE(0x2040, 0x200a), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > - { USB_DEVICE(0x2040, 0x2010), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > - { USB_DEVICE(0x2040, 0x2011), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > - { USB_DEVICE(0x2040, 0x2019), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, > - { USB_DEVICE(0x2040, 0x5500), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0x5510), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0x5520), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0x5530), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0x5580), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0x5590), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x187f, 0x0202), > - .driver_info = SMS1XXX_BOARD_SIANO_NICE }, > - { USB_DEVICE(0x187f, 0x0301), > - .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, > - { USB_DEVICE(0x2040, 0xb900), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xb910), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xb980), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xb990), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xc000), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xc010), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xc080), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { USB_DEVICE(0x2040, 0xc090), > - .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, > - { } /* Terminating entry */ > - }; > - > -MODULE_DEVICE_TABLE(usb, smsusb_id_table); > - > static struct usb_driver smsusb_driver = { > .name = "smsusb", > .probe = smsusb_probe, -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c index b1c38a2..d7ef147 100644 --- a/drivers/media/dvb/siano/smsusb.c +++ b/drivers/media/dvb/siano/smsusb.c @@ -2,7 +2,7 @@ Siano Mobile Silicon, Inc. MDTV receiver kernel modules. -Copyright (C) 2005-2009, Uri Shkolnik, Anatoly Greenblat +Copyright (C) 2006-2011, Doron Cohen Cohen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,21 +29,93 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "sms-cards.h" #include "smsendian.h" -static int sms_dbg; -module_param_named(debug, sms_dbg, int, 0644); +int sms_debug; +module_param_named(debug, sms_debug, int, 0644); MODULE_PARM_DESC(debug, "set debug level (info=1, adv=2 (or-able))"); #define USB1_BUFFER_SIZE 0x1000 -#define USB2_BUFFER_SIZE 0x4000 +#define USB2_BUFFER_SIZE 0x2000 #define MAX_BUFFERS 50 #define MAX_URBS 10 + +struct usb_device_id smsusb_id_table[] = { + { USB_DEVICE(0x187f, 0x0010), + .driver_info = SMS1XXX_BOARD_SIANO_STELLAR_ROM }, + { USB_DEVICE(0x187f, 0x0100), + .driver_info = SMS1XXX_BOARD_SIANO_STELLAR }, + { USB_DEVICE(0x187f, 0x0200), + .driver_info = SMS1XXX_BOARD_SIANO_NOVA_A }, + { USB_DEVICE(0x187f, 0x0201), + .driver_info = SMS1XXX_BOARD_SIANO_NOVA_B }, + { USB_DEVICE(0x187f, 0x0300), + .driver_info = SMS1XXX_BOARD_SIANO_VEGA }, + { USB_DEVICE(0x2040, 0x1700), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_CATAMOUNT }, + { USB_DEVICE(0x2040, 0x1800), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_A }, + { USB_DEVICE(0x2040, 0x1801), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_OKEMO_B }, + { USB_DEVICE(0x2040, 0x2000), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, + { USB_DEVICE(0x2040, 0x2009), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD_R2 }, + { USB_DEVICE(0x2040, 0x200a), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, + { USB_DEVICE(0x2040, 0x2010), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, + { USB_DEVICE(0x2040, 0x2019), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_TIGER_MINICARD }, + { USB_DEVICE(0x2040, 0x5500), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0x5510), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0x5520), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0x5530), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0x5580), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x2040, 0x5590), + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM }, + { USB_DEVICE(0x187f, 0x0202), + .driver_info = SMS1XXX_BOARD_SIANO_NICE }, + { USB_DEVICE(0x187f, 0x0301), + .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, + { USB_DEVICE(0x187f, 0x0302), + .driver_info = SMS1XXX_BOARD_SIANO_VENICE }, + { USB_DEVICE(0x187f, 0x0310), + .driver_info = SMS1XXX_BOARD_SIANO_MING }, + { USB_DEVICE(0x187f, 0x0500), + .driver_info = SMS1XXX_BOARD_SIANO_PELE }, + { USB_DEVICE(0x187f, 0x0600), + .driver_info = SMS1XXX_BOARD_SIANO_RIO }, + { USB_DEVICE(0x187f, 0x0700), + .driver_info = SMS1XXX_BOARD_SIANO_DENVER_2160 }, + { USB_DEVICE(0x187f, 0x0800), + .driver_info = SMS1XXX_BOARD_SIANO_DENVER_1530 }, + { USB_DEVICE(0x19D2, 0x0086), + .driver_info = SMS1XXX_BOARD_ZTE_DVB_DATA_CARD }, + { USB_DEVICE(0x19D2, 0x0078), + .driver_info = SMS1XXX_BOARD_ONDA_MDTV_DATA_CARD }, + { } /* Terminating entry */ + }; + +MODULE_DEVICE_TABLE(usb, smsusb_id_table); + +enum smsusb_state { + SMSUSB_DISCONNECTED, + SMSUSB_SUSPENDED, + SMSUSB_ACTIVE +}; + struct smsusb_device_t; struct smsusb_urb_t { + struct list_head entry; struct smscore_buffer_t *cb; - struct smsusb_device_t *dev; + struct smsusb_device_t *dev; struct urb urb;