Re: [PATCH v15 06/10] USB/ppc4xx: Add Synopsys DWC OTG HCD queue function

2011-10-20 Thread Pratyush Anand
On Sat, Oct 15, 2011 at 3:39 AM,  tma...@apm.com wrote:
 From: Tirumala Marri tma...@apm.com

 Implements functions to manage Queue Heads and Queue
 Transfer Descriptors of DWC USB OTG Controller.

 Signed-off-by: Tirumala R Marri tma...@apm.com
 Signed-off-by: Fushen Chen fc...@apm.com
 Signed-off-by: Mark Miesfeld mmiesf...@apm.com
 ---
  drivers/usb/dwc/hcd_queue.c |  696 
 +++
  1 files changed, 696 insertions(+), 0 deletions(-)
  create mode 100644 drivers/usb/dwc/hcd_queue.c

 diff --git a/drivers/usb/dwc/hcd_queue.c b/drivers/usb/dwc/hcd_queue.c
 new file mode 100644
 index 000..67f0409
 --- /dev/null
 +++ b/drivers/usb/dwc/hcd_queue.c
 @@ -0,0 +1,696 @@
 +/*
 + * DesignWare HS OTG controller driver
 + * Copyright (C) 2006 Synopsys, Inc.
 + * Portions Copyright (C) 2010 Applied Micro Circuits Corporation.
 + *
 + * This program is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License
 + * version 2 as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope that it will be useful
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 + * GNU General Public License version 2 for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, see http://www.gnu.org/licenses
 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
 + * Suite 500, Boston, MA 02110-1335 USA.
 + *
 + * Based on Synopsys driver version 2.60a
 + * Modified by Mark Miesfeld mmiesf...@apm.com
 + * Modified by Stefan Roese s...@denx.de, DENX Software Engineering
 + * Modified by Chuck Meade ch...@theptrgroup.com
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS 
 IS
 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED. IN NO EVENT SHALL SYNOPSYS, INC. BE LIABLE FOR ANY DIRECT,
 + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES
 + * (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 SERVICES;
 + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 AND
 + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT
 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + *
 + */
 +
 +/*
 + * This file contains the functions to manage Queue Heads and Queue
 + * Transfer Descriptors.
 + */
 +
 +#include hcd.h
 +
 +static inline int is_fs_ls(enum usb_device_speed speed)
 +{
 +       return speed == USB_SPEED_FULL || speed == USB_SPEED_LOW;
 +}
 +
 +/* Allocates memory for a QH structure. */
 +static inline struct dwc_qh *dwc_otg_hcd_qh_alloc(void)
 +{
 +       return kmalloc(sizeof(struct dwc_qh), GFP_ATOMIC);
 +}
 +
 +/**
 + * Initializes a QH structure to initialize the QH.
 + */
 +#define SCHEDULE_SLOP 10
 +static void dwc_otg_hcd_qh_init(struct dwc_hcd *hcd, struct dwc_qh *qh,
 +                               struct urb *urb)
 +{
 +       memset(qh, 0, sizeof(struct dwc_qh));
 +
 +       /* Initialize QH */
 +       switch (usb_pipetype(urb-pipe)) {
 +       case PIPE_CONTROL:
 +               qh-ep_type = USB_ENDPOINT_XFER_CONTROL;
 +               break;
 +       case PIPE_BULK:
 +               qh-ep_type = USB_ENDPOINT_XFER_BULK;
 +               break;
 +       case PIPE_ISOCHRONOUS:
 +               qh-ep_type = USB_ENDPOINT_XFER_ISOC;
 +               break;
 +       case PIPE_INTERRUPT:
 +               qh-ep_type = USB_ENDPOINT_XFER_INT;
 +               break;
 +       }
 +
 +       qh-ep_is_in = usb_pipein(urb-pipe) ? 1 : 0;
 +       qh-data_toggle = DWC_OTG_HC_PID_DATA0;
 +       qh-maxp = usb_maxpacket(urb-dev, urb-pipe, 
 !(usb_pipein(urb-pipe)));
 +
 +       INIT_LIST_HEAD(qh-qtd_list);
 +       INIT_LIST_HEAD(qh-qh_list_entry);
 +
 +       qh-channel = NULL;
 +       qh-speed = urb-dev-speed;
 +
 +       /*
 +        * FS/LS Enpoint on HS Hub NOT virtual root hub
 +        */
 +       qh-do_split = 0;
 +       if (is_fs_ls(urb-dev-speed)  urb-dev-tt  urb-dev-tt-hub 
 +           urb-dev-tt-hub-devnum != 1)
 +               qh-do_split = 1;
 +
 +       if (qh-ep_type == USB_ENDPOINT_XFER_INT ||
 +           qh-ep_type == USB_ENDPOINT_XFER_ISOC) {
 +               /* Compute scheduling parameters once and save them. */
 +               u32 hprt;
 +               int bytecount = dwc_hb_mult(qh-maxp) *
 +                   dwc_max_packet(qh-maxp);
 +
 +               qh-usecs = NS_TO_US(usb_calc_bus_time(urb-dev-speed,
 +                                                      usb_pipein(urb-pipe),
 +                                                      (qh-ep_type ==
 +                                       

Re: [PATCH v15 06/10] USB/ppc4xx: Add Synopsys DWC OTG HCD queue function

2011-10-20 Thread Philipp Ittershagen
Hello Tirumala,


I have some coding style comments below.


On Sat, Oct 15, 2011 at 12:09 AM,  tma...@apm.com wrote:
 From: Tirumala Marri tma...@apm.com

 Implements functions to manage Queue Heads and Queue
 Transfer Descriptors of DWC USB OTG Controller.

 Signed-off-by: Tirumala R Marri tma...@apm.com
 Signed-off-by: Fushen Chen fc...@apm.com
 Signed-off-by: Mark Miesfeld mmiesf...@apm.com
 ---
  drivers/usb/dwc/hcd_queue.c |  696 
 +++
  1 files changed, 696 insertions(+), 0 deletions(-)
  create mode 100644 drivers/usb/dwc/hcd_queue.c

 diff --git a/drivers/usb/dwc/hcd_queue.c b/drivers/usb/dwc/hcd_queue.c
 new file mode 100644
 index 000..67f0409
 --- /dev/null
 +++ b/drivers/usb/dwc/hcd_queue.c
 @@ -0,0 +1,696 @@
 +/*
 + * DesignWare HS OTG controller driver
 + * Copyright (C) 2006 Synopsys, Inc.
 + * Portions Copyright (C) 2010 Applied Micro Circuits Corporation.
 + *
 + * This program is free software: you can redistribute it and/or
 + * modify it under the terms of the GNU General Public License
 + * version 2 as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope that it will be useful
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 + * GNU General Public License version 2 for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, see http://www.gnu.org/licenses
 + * or write to the Free Software Foundation, Inc., 51 Franklin Street,
 + * Suite 500, Boston, MA 02110-1335 USA.
 + *
 + * Based on Synopsys driver version 2.60a
 + * Modified by Mark Miesfeld mmiesf...@apm.com
 + * Modified by Stefan Roese s...@denx.de, DENX Software Engineering
 + * Modified by Chuck Meade ch...@theptrgroup.com
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS 
 IS
 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED. IN NO EVENT SHALL SYNOPSYS, INC. BE LIABLE FOR ANY DIRECT,
 + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES
 + * (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 SERVICES;
 + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 AND
 + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT
 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 + *
 + */
 +
 +/*
 + * This file contains the functions to manage Queue Heads and Queue
 + * Transfer Descriptors.
 + */
 +
 +#include hcd.h
 +
 +static inline int is_fs_ls(enum usb_device_speed speed)
 +{
 +   return speed == USB_SPEED_FULL || speed == USB_SPEED_LOW;
 +}
 +
 +/* Allocates memory for a QH structure. */
 +static inline struct dwc_qh *dwc_otg_hcd_qh_alloc(void)
 +{
 +   return kmalloc(sizeof(struct dwc_qh), GFP_ATOMIC);
 +}

Why do you have this extra function? I know its inlined, but it does not
increase code readability.

 +
 +/**
 + * Initializes a QH structure to initialize the QH.
 + */
 +#define SCHEDULE_SLOP 10
 +static void dwc_otg_hcd_qh_init(struct dwc_hcd *hcd, struct dwc_qh *qh,
 +   struct urb *urb)
 +{
 +   memset(qh, 0, sizeof(struct dwc_qh));
 +
 +   /* Initialize QH */
 +   switch (usb_pipetype(urb-pipe)) {
 +   case PIPE_CONTROL:
 +   qh-ep_type = USB_ENDPOINT_XFER_CONTROL;
 +   break;
 +   case PIPE_BULK:
 +   qh-ep_type = USB_ENDPOINT_XFER_BULK;
 +   break;
 +   case PIPE_ISOCHRONOUS:
 +   qh-ep_type = USB_ENDPOINT_XFER_ISOC;
 +   break;
 +   case PIPE_INTERRUPT:
 +   qh-ep_type = USB_ENDPOINT_XFER_INT;
 +   break;
 +   }
 +
 +   qh-ep_is_in = usb_pipein(urb-pipe) ? 1 : 0;
 +   qh-data_toggle = DWC_OTG_HC_PID_DATA0;
 +   qh-maxp = usb_maxpacket(urb-dev, urb-pipe, 
 !(usb_pipein(urb-pipe)));
 +
 +   INIT_LIST_HEAD(qh-qtd_list);
 +   INIT_LIST_HEAD(qh-qh_list_entry);
 +
 +   qh-channel = NULL;
 +   qh-speed = urb-dev-speed;
 +
 +   /*
 +* FS/LS Enpoint on HS Hub NOT virtual root hub
 +*/
 +   qh-do_split = 0;
 +   if (is_fs_ls(urb-dev-speed)  urb-dev-tt  urb-dev-tt-hub 
 +   urb-dev-tt-hub-devnum != 1)
 +   qh-do_split = 1;
 +
 +   if (qh-ep_type == USB_ENDPOINT_XFER_INT ||
 +   qh-ep_type == USB_ENDPOINT_XFER_ISOC) {
 +   /* Compute scheduling parameters once and save them. */
 +   u32 hprt;
 +   int bytecount = dwc_hb_mult(qh-maxp) *
 +   dwc_max_packet(qh-maxp);
 +
 +   qh-usecs = NS_TO_US(usb_calc_bus_time(urb-dev-speed,
 +

[PATCH v15 06/10] USB/ppc4xx: Add Synopsys DWC OTG HCD queue function

2011-10-14 Thread tmarri
From: Tirumala Marri tma...@apm.com

Implements functions to manage Queue Heads and Queue
Transfer Descriptors of DWC USB OTG Controller.

Signed-off-by: Tirumala R Marri tma...@apm.com
Signed-off-by: Fushen Chen fc...@apm.com
Signed-off-by: Mark Miesfeld mmiesf...@apm.com
---
 drivers/usb/dwc/hcd_queue.c |  696 +++
 1 files changed, 696 insertions(+), 0 deletions(-)
 create mode 100644 drivers/usb/dwc/hcd_queue.c

diff --git a/drivers/usb/dwc/hcd_queue.c b/drivers/usb/dwc/hcd_queue.c
new file mode 100644
index 000..67f0409
--- /dev/null
+++ b/drivers/usb/dwc/hcd_queue.c
@@ -0,0 +1,696 @@
+/*
+ * DesignWare HS OTG controller driver
+ * Copyright (C) 2006 Synopsys, Inc.
+ * Portions Copyright (C) 2010 Applied Micro Circuits Corporation.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License version 2 for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see http://www.gnu.org/licenses
+ * or write to the Free Software Foundation, Inc., 51 Franklin Street,
+ * Suite 500, Boston, MA 02110-1335 USA.
+ *
+ * Based on Synopsys driver version 2.60a
+ * Modified by Mark Miesfeld mmiesf...@apm.com
+ * Modified by Stefan Roese s...@denx.de, DENX Software Engineering
+ * Modified by Chuck Meade ch...@theptrgroup.com
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SYNOPSYS, INC. BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * This file contains the functions to manage Queue Heads and Queue
+ * Transfer Descriptors.
+ */
+
+#include hcd.h
+
+static inline int is_fs_ls(enum usb_device_speed speed)
+{
+   return speed == USB_SPEED_FULL || speed == USB_SPEED_LOW;
+}
+
+/* Allocates memory for a QH structure. */
+static inline struct dwc_qh *dwc_otg_hcd_qh_alloc(void)
+{
+   return kmalloc(sizeof(struct dwc_qh), GFP_ATOMIC);
+}
+
+/**
+ * Initializes a QH structure to initialize the QH.
+ */
+#define SCHEDULE_SLOP 10
+static void dwc_otg_hcd_qh_init(struct dwc_hcd *hcd, struct dwc_qh *qh,
+   struct urb *urb)
+{
+   memset(qh, 0, sizeof(struct dwc_qh));
+
+   /* Initialize QH */
+   switch (usb_pipetype(urb-pipe)) {
+   case PIPE_CONTROL:
+   qh-ep_type = USB_ENDPOINT_XFER_CONTROL;
+   break;
+   case PIPE_BULK:
+   qh-ep_type = USB_ENDPOINT_XFER_BULK;
+   break;
+   case PIPE_ISOCHRONOUS:
+   qh-ep_type = USB_ENDPOINT_XFER_ISOC;
+   break;
+   case PIPE_INTERRUPT:
+   qh-ep_type = USB_ENDPOINT_XFER_INT;
+   break;
+   }
+
+   qh-ep_is_in = usb_pipein(urb-pipe) ? 1 : 0;
+   qh-data_toggle = DWC_OTG_HC_PID_DATA0;
+   qh-maxp = usb_maxpacket(urb-dev, urb-pipe, !(usb_pipein(urb-pipe)));
+
+   INIT_LIST_HEAD(qh-qtd_list);
+   INIT_LIST_HEAD(qh-qh_list_entry);
+
+   qh-channel = NULL;
+   qh-speed = urb-dev-speed;
+
+   /*
+* FS/LS Enpoint on HS Hub NOT virtual root hub
+*/
+   qh-do_split = 0;
+   if (is_fs_ls(urb-dev-speed)  urb-dev-tt  urb-dev-tt-hub 
+   urb-dev-tt-hub-devnum != 1)
+   qh-do_split = 1;
+
+   if (qh-ep_type == USB_ENDPOINT_XFER_INT ||
+   qh-ep_type == USB_ENDPOINT_XFER_ISOC) {
+   /* Compute scheduling parameters once and save them. */
+   u32 hprt;
+   int bytecount = dwc_hb_mult(qh-maxp) *
+   dwc_max_packet(qh-maxp);
+
+   qh-usecs = NS_TO_US(usb_calc_bus_time(urb-dev-speed,
+  usb_pipein(urb-pipe),
+  (qh-ep_type ==
+   USB_ENDPOINT_XFER_ISOC),
+  bytecount));
+
+   /* Start in a slightly future (micro)frame. */
+