From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: doronc@siano-ms.com
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH 7/17]DVB:Siano drivers - Support flexiable usb endpoint rather than hard-cored numbers.
Date: Fri, 23 Sep 2011 19:25:56 -0300 [thread overview]
Message-ID: <4E7D0774.1050202@redhat.com> (raw)
In-Reply-To: <1316514677.5199.85.camel@Doron-Ubuntu>
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,
prev parent reply other threads:[~2011-09-23 22:26 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-20 10:31 [PATCH 7/17]DVB:Siano drivers - Support flexiable usb endpoint rather than hard-cored numbers Doron Cohen
2011-09-23 22:25 ` Mauro Carvalho Chehab [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E7D0774.1050202@redhat.com \
--to=mchehab@redhat.com \
--cc=doronc@siano-ms.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.