Hello,
I am writing a driver for USB to Serial converter /bridge having 4
serial ports .
I was going through the existing USB to Serial driver . I have a few
questions related to those .
I would be glad to receive responses to my queries .
1. "num_interrupt_in" field in the usb_serial_device_type structure is
for the device and not for the port .
I mean if there is a device which has INTERRUPT IN and BULK OUT
endpoints per port and has 4 such ports
I would decalare usb_serial_device_type with the fields poplulated as
follows
.num_interrupt_in = 4,
.num_bulk_in = 0,
.num_bulk_out = 4,
.num_ports = 4,
2. what are the tx Credits for the edgeport adapter ? I really didnt
get a feel of what it means .
3. Do I need to maintain a buffer at the driver level . What governs the
desicion of having a buffer at the driver level.
In many sample drivers I found a separate buffer - e.g pl2303.c ,
kobil_sct.c .
I guess it should be a good since we can only transmit 64 bytes (
maxPacketSize of endpoint ) in an URB and the
applications talking to serial device may send more bytes than these .
4. What should be the criteria used to select the size of the buffer .
5. What is the significance of this step in "kobil_write()" and
"kobil_read_int_callback"
// someone sets the dev to 0 if the close method has been called
port->interrupt_in_urb->dev = port->serial->dev;
Thanks ,
Monali.
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On
> Behalf Of [EMAIL PROTECTED]
> Sent: Friday, March 18, 2005 7:32 AM
> To: [email protected]
> Subject: linux-usb-devel digest, Vol 1 #4491 - 24 msgs
>
>
> Send linux-usb-devel mailing list submissions to
> [email protected]
>
> To subscribe or unsubscribe via the World Wide Web, visit
> https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
> or, via email, send a message with subject or body 'help' to
> [EMAIL PROTECTED]
>
> You can reach the person managing the list at
> [EMAIL PROTECTED]
>
> When replying, please edit your Subject line so it is more
> specific than "Re: Contents of linux-usb-devel digest..."
>
>
> Today's Topics:
>
> 1. Re: Re: driver core fix proposal (was [PATCH] 1/3
> cdc acm errors) (Alan Stern)
> 2. Re: FWD: get devices change event in sysfs? (Christopher Li)
> 3. Re: FWD: get devices change event in sysfs? (Christopher Li)
> 4. Re: [2.6 patch] USB: possible cleanups (Greg KH)
> 5. Re: [2.6 patch] drivers/usb/serial/: make some
> functions static (Greg KH)
> 6. Re: [2.6 patch] drivers/usb/storage/: cleanups (Greg KH)
> 7. Re: [2.6 patch] drivers/usb/net/pegasus.c: make some
> code static (Greg KH)
> 8. Re: [2.6 patch] remove drivers/usb/image/hpusbscsi.c (Greg KH)
> 9. What's wrong with iso-IN split transactions? (Antti Andreimann)
> 10. Re: [patch 2.6.11-usb] usbnet gets status polling, uses
> for CDC Ethernet (Greg KH)
> 11. Re: [patch 2.6.11] ohci zero length control IN
> transfers (Greg KH)
> 12. Re: [patch 2.6.11] ehci and short in-bulk transfers
> with 20KB+ urbs (Greg KH)
> 13. Re: [patch 2.6.11-usb] net2280 reports correct dequeue
> status (Greg KH)
> 14. Re: [patch 2.6.11-usb] usbnet fix for Zaurus C-860 (Greg KH)
> 15. Re: [patch 2.6.11-usb] ethernet/rndis gadget driver
> updates (Greg KH)
> 16. Re: [patch 2.6] add at91_udc recognition (Greg KH)
> 17. Re: [patch 2.6] usb gadget kconfig tweaks (Greg KH)
> 18. Re: Patch for ub to fix oops after disconnect (Greg KH)
> 19. Re: [PATCH as481] g_file_storage: add configuration and
> interface strings (Greg KH)
> 20. Re: [PATCH]removal of obsolete error code from kaweth (Greg KH)
> 21. Re: [PATCH as482] usb-midi: fix arguments to
> usb_maxpacket() (Greg KH)
> 22. Re: [PATCH as483] Prevent hub driver interference
> during port reset (Greg KH)
> 23. [patch 2.6.11] pxa25x udc updates, mostly PM (David Brownell)
>
> --__--__--
>
> Message: 1
> Date: Thu, 17 Mar 2005 16:08:24 -0500 (EST)
> From: Alan Stern <[EMAIL PROTECTED]>
> To: Brian Murphy <[EMAIL PROTECTED]>
> cc: David Brownell <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>,
> <[email protected]>, <[EMAIL PROTECTED]>
> Subject: Re: [linux-usb-devel] Re: driver core fix proposal
> (was [PATCH] 1/3 cdc acm errors)
>
> On Thu, 17 Mar 2005, Brian Murphy wrote:
>
> > Yes, that is correct. This is a design error (mine or the device
> > core).
> >
> > So how about the patch then, any comments?
>
> Actually it looked good to me.
>
> Alan Stern
>
>
>
> --__--__--
>
> Message: 2
> Date: Thu, 17 Mar 2005 13:53:14 -0500
> From: Christopher Li <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: Re: [linux-usb-devel] FWD: get devices change event in sysfs?
>
> That is good to know.
>
> Chris
>
> On Wed, Mar 16, 2005 at 07:36:09PM -0800, David Brownell wrote:
> > On Wednesday 16 March 2005 3:26 pm, Christopher Li wrote:
> > > > In come to my attention that the later SuSE kernel has
> change the
> > > > /proc/bus/usb/devices to
> > > > /proc/bus/usb/devices_please-use-sysfs-instead.
> >
> > I think SuSE 9.1 does, but 9.2 reverted that bogosity.
> >
>
>
> --__--__--
>
> Message: 3
> Date: Thu, 17 Mar 2005 13:52:25 -0500
> From: Christopher Li <[EMAIL PROTECTED]>
> To: Alan Stern <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: FWD: get devices change event in sysfs?
>
> Hi Alan,
>
> Thanks for your reply.
>
> On Wed, Mar 16, 2005 at 10:17:13PM -0500, Alan Stern wrote:
> >
> > I have to wonder why they did that? How do they think
> people can use
> > sysfs instead of /proc/bus/usb/devices? There's lots of
> information in
> > /proc/bus/usb/devices that isn't in sysfs at all.
>
> I am wondering about the same thing.
>
> >
> > > > Of course, that breaks the VMWare and I add some option to use
> > > > this wired file name.
> > > >
> > > > I am wondering how to get the devices change event from
> sysfs in
> > > > the user space if VMware want to use sysfs instead?
> >
> > Device change events have nothing to do with either sysfs or
> > /proc/bus/usb/devices. Use hotplug.
>
> Right now VMware select() on the /proc/bus/usb/devices for
> the device change event arrived. Maybe this topic belong to
> the hotplug mailing list.
>
>
> >
> > Short of rmmod'ing a driver, there is no way to prevent the kernel
> > from
> > binding it to a device. However, VMware can tell the
> kernel to _unbind_ a
> > driver by using the USBDEVFS_DISCONNECT ioctl in usbfs.
>
> I add the USBDEVFS_DISCONNECT to VMware recently. But that
> doesn't solved all the problems.
>
> Let the device bind to a kernel driver then disconnect it
> again will disturb some (broken) USB devices. Some PDA
> syncing tend to have this problem. I guess the firmware in
> the PDA has some pretty straight forward initialing
> sequence in mind, anything beyond that is likely goto an
> untested code path.
>
> In that case, it would be best not to let the kernel driver
> touch the device at all. I am thinking an option that kernel
> will aways pass the event to hotplug and let the hotplug
> decide what to do next.
>
>
> >
> > It might be possible to change the hotplug manager so that VMware
> > could
> > tell it to ignore USB events.
>
> I will look into that. As I mention above, the kernel needs
> the ability to the skip the binding in the first place.
>
> Thanks again.
>
> Chris
>
>
> --__--__--
>
> Message: 4
> Date: Thu, 17 Mar 2005 17:02:28 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Adrian Bunk <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED], [email protected],
> [email protected]
> Subject: [linux-usb-devel] Re: [2.6 patch] USB: possible cleanups
>
> On Tue, Mar 01, 2005 at 01:43:52AM +0100, Adrian Bunk wrote:
> > Before I'm getting flamed to death:
> > This patch contains possible cleanups. If parts of this
> patch conflict
> > with pending changes these parts of my patch have to be dropped.
> >
> > This patch contains the following possible cleanups:
> > - make needlessly global code static
> > - #if 0 the following unused global functions:
> > - core/usb.c: usb_buffer_map
> > - core/usb.c: usb_buffer_unmap
> > - remove the following unneeded EXPORT_SYMBOL's:
> > - core/hcd.c: usb_bus_init
> > - core/hcd.c: usb_alloc_bus
> > - core/hcd.c: usb_register_bus
> > - core/hcd.c: usb_deregister_bus
> > - core/hcd.c: usb_hcd_irq
> > - core/usb.c: usb_buffer_map
> > - core/usb.c: usb_buffer_unmap
> > - core/buffer.c: hcd_buffer_create
> > - core/buffer.c: hcd_buffer_destroy
> >
> > Signed-off-by: Adrian Bunk <[EMAIL PROTECTED]>
>
> Looks good to me, thanks for the patch. Applied.
>
> greg k-h
>
>
> --__--__--
>
> Message: 5
> Date: Thu, 17 Mar 2005 17:17:41 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Adrian Bunk <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED], [email protected],
> [email protected]
> Subject: [linux-usb-devel] Re: [2.6 patch]
> drivers/usb/serial/: make some functions static
>
> On Tue, Mar 01, 2005 at 01:39:35AM +0100, Adrian Bunk wrote:
> > This patch makes some needlessly global functions static.
> >
> > Signed-off-by: Adrian Bunk <[EMAIL PROTECTED]>
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 6
> Date: Thu, 17 Mar 2005 17:17:46 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Adrian Bunk <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED],
> [email protected],
> [email protected]
> Subject: [linux-usb-devel] Re: [2.6 patch]
> drivers/usb/storage/: cleanups
>
> On Tue, Mar 01, 2005 at 01:37:58AM +0100, Adrian Bunk wrote:
> > This patch contains the following cleanups:
> > - make needlessly global code static
> > - scsiglue.c: remove the unused usb_stor_sense_notready
> >
> > Signed-off-by: Adrian Bunk <[EMAIL PROTECTED]>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 7
> Date: Thu, 17 Mar 2005 17:17:51 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Adrian Bunk <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED],
> [email protected],
> [email protected]
> Subject: [linux-usb-devel] Re: [2.6 patch]
> drivers/usb/net/pegasus.c: make some code static
>
> On Tue, Mar 01, 2005 at 01:35:41AM +0100, Adrian Bunk wrote:
> > This patch makes some needlessly global code static.
> >
> > Signed-off-by: Adrian Bunk <[EMAIL PROTECTED]>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 8
> Date: Thu, 17 Mar 2005 17:17:56 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Adrian Bunk <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED], [email protected],
> [email protected]
> Subject: [linux-usb-devel] Re: [2.6 patch] remove
> drivers/usb/image/hpusbscsi.c
>
> On Thu, Mar 03, 2005 at 02:38:56PM +0100, Adrian Bunk wrote:
> > USB_HPUSBSCSI was marked as BROKEN in 2.6.11 since libsane is the
> > preferred way to access these devices.
> >
> > Unless someone plans to resurrect this driver, I'm
> therefore proposing
> > this patch to completely remove it.
> >
> > Signed-off-by: Adrian Bunk <[EMAIL PROTECTED]>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 9
> From: Antti Andreimann <[EMAIL PROTECTED]>
> To: [email protected]
> Date: Fri, 18 Mar 2005 03:27:11 +0200
> Subject: [linux-usb-devel] What's wrong with iso-IN split
> transactions?
>
> Hi!
>
> I see from the drivers/usb/host/ehci-sched.c that those are
> not supported. I also found a year-old post in this list by
> David Brownell which states:
>
> > It's essentially all coded, but microframe scheduling needs
> tweaks for
> > the IN cases. I decided to force ENOMEM until that code is
> ready ...
> > someone willing to play with the code could turn it on and
> shouldn't
> > find it needs many changes.
>
> What is the status of this stuff now? Has anyone done any
> work on this and what exactly is the problem with current
> code? I did try to turn it on for my USB soundcard (so it
> would work through a USB 2.0 hub) and experienced a NULL
> pointer dereference plus some spinlock errors. I haven't
> tried it without pre-emption yet. I am willing to spend some
> time to tweak and test it if I'd know what exactly needs tweaking ;)
>
> --
> Antti Andreimann - Security Expert
> Using Linux since 1993
> Member of ELUG since 29.01.2000
>
>
> --__--__--
>
> Message: 10
> Date: Thu, 17 Mar 2005 17:33:18 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6.11-usb] usbnet gets
> status polling, uses for CDC Ethernet
>
> On Sun, Mar 06, 2005 at 08:50:11PM -0800, David Brownell wrote:
> > This patch applies with minor offsets against the latest USB BK,
> > adding status/interrupt transfer support to the infrastructure and
> > using it for CDC Ethernet for link status notifications.
> Please merge.
>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 11
> Date: Thu, 17 Mar 2005 17:33:08 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6.11] ohci zero
> length control IN transfers
>
> On Wed, Mar 02, 2005 at 09:18:18AM -0800, David Brownell wrote:
> > This fixes a rare protocol bug that's been with us since at
> least 2.4
> > days; please merge.
>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 12
> Date: Thu, 17 Mar 2005 17:33:13 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6.11] ehci and short
> in-bulk transfers with 20KB+ urbs
>
> On Thu, Mar 03, 2005 at 11:18:08AM -0800, David Brownell wrote:
> > This addresses the problem Steve Hosgood was seeing, which
> seems to be
> > a chip-specific misbehavior with certain sizes for urb buffers.
> > Please merge.
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 13
> Date: Thu, 17 Mar 2005 17:33:29 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6.11-usb] net2280
> reports correct dequeue status
>
> On Sun, Mar 06, 2005 at 10:55:58PM -0800, David Brownell wrote:
> > Driver was wrongly reporting failure in some cases; please merge.
> >
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 14
> Date: Thu, 17 Mar 2005 17:33:23 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected],
> Holger Klawitter <[EMAIL PROTECTED]>
> Subject: [linux-usb-devel] Re: [patch 2.6.11-usb] usbnet fix
> for Zaurus C-860
>
> On Sun, Mar 06, 2005 at 08:50:18PM -0800, David Brownell wrote:
> > This fixes the problem Holger had with his Zaurus, and adds
> some more
> > class declarations to the <linux/usb_cdc.h> headers. Please merge.
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 15
> Date: Thu, 17 Mar 2005 17:33:34 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6.11-usb]
> ethernet/rndis gadget driver updates
>
> On Sun, Mar 06, 2005 at 10:56:01PM -0800, David Brownell wrote:
> > This has several small updates; please merge.
>
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 16
> Date: Thu, 17 Mar 2005 17:32:53 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: Greg KH <[EMAIL PROTECTED]>, [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6] add at91_udc recognition
>
> On Mon, Feb 28, 2005 at 06:45:21PM -0800, David Brownell wrote:
> > This just adds recognition for the Atmel AT91 USB peripheral
> > controller. (And a missing check for the Samsung S3C2410.) This
> > PIO-only hardware is used in a variety of chips, including the
> > at91rm9200. (That one has an MMU and runs "regular Linux".)
> >
> > Please merge; the patch is against your current BK.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 17
> Date: Thu, 17 Mar 2005 17:33:03 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: David Brownell <[EMAIL PROTECTED]>
> Cc: Greg KH <[EMAIL PROTECTED]>, [email protected]
> Subject: [linux-usb-devel] Re: [patch 2.6] usb gadget kconfig tweaks
>
> On Mon, Feb 28, 2005 at 07:05:55PM -0800, David Brownell wrote:
> > Removes sa-1100 support until someone finishes that driver;
> and moves
> > dummy_hcd to the end so that Kconfig will preferentially configure
> > real hardware.
>
> Applied, thanks.
>
> greg k-h
>
>
>
> --__--__--
>
> Message: 18
> Date: Thu, 17 Mar 2005 17:49:55 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Pete Zaitcev <[EMAIL PROTECTED]>
> Cc: [EMAIL PROTECTED], [email protected]
> Subject: [linux-usb-devel] Re: Patch for ub to fix oops after
> disconnect
>
> On Mon, Feb 21, 2005 at 02:22:15PM -0800, Pete Zaitcev wrote:
> > Please pass this to Linus as soon as practical, because this is a
> > bugfix.
> >
> > This patch was developed by Glenn Maynard for his oops back in
> > December, but for some reason I forgot about it and had it
> > reimplemented when I stepped on this problem myself. In my
> case, there
> > was no oops, but a warning about slab corruption.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 19
> Date: Thu, 17 Mar 2005 17:56:39 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Alan Stern <[EMAIL PROTECTED]>
> Cc: USB development list <[email protected]>
> Subject: [linux-usb-devel] Re: [PATCH as481] g_file_storage:
> add configuration and interface strings
>
> On Fri, Mar 04, 2005 at 04:15:40PM -0500, Alan Stern wrote:
> > Greg:
> >
> > This patch adds iConfiguration and iInterface strings to the
> > g_file_storage driver (just to spiff it up and help in testing
> > software that looks at those strings). It also enlarges the space
> > reserved for the Manufacturer string, since combinations of long
> > kernel names and long UDC driver names were sometimes getting
> > truncated.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 20
> Date: Thu, 17 Mar 2005 17:56:27 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Oliver Neukum <[EMAIL PROTECTED]>
> Cc: David Brownell <[EMAIL PROTECTED]>,
> [email protected]
> Subject: [linux-usb-devel] Re: [PATCH]removal of obsolete
> error code from kaweth
>
> On Sat, Mar 05, 2005 at 09:01:04AM +0100, Oliver Neukum wrote:
> > Hi,
> >
> > this patch from David removes an obsolete error code from kaweth.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 21
> Date: Thu, 17 Mar 2005 17:57:11 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Alan Stern <[EMAIL PROTECTED]>
> Cc: USB development list <[email protected]>
> Subject: [linux-usb-devel] Re: [PATCH as482] usb-midi: fix
> arguments to usb_maxpacket()
>
> On Mon, Feb 28, 2005 at 12:09:12PM -0500, Alan Stern wrote:
> > Greg:
> >
> > The usb-midi driver uses an incorrect value for the is_out
> argument to
> > usb_maxpacket(), triggering a WARN_ON. This patch fixes
> the mistake.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 22
> Date: Thu, 17 Mar 2005 17:56:32 -0800
> From: Greg KH <[EMAIL PROTECTED]>
> To: Alan Stern <[EMAIL PROTECTED]>
> Cc: USB development list <[email protected]>
> Subject: [linux-usb-devel] Re: [PATCH as483] Prevent hub
> driver interference during port reset
>
> On Fri, Mar 04, 2005 at 04:21:36PM -0500, Alan Stern wrote:
> > Greg:
> >
> > This patch causes the hub driver to ignore ports that are
> being reset
> > by another driver. Without this protection khubd will sometimes
> > notice that the port is behaving funny while the reset is
> taking place
> > and will unilaterally disconnect it, which is not what we want.
>
> Applied, thanks.
>
> greg k-h
>
>
> --__--__--
>
> Message: 23
> From: David Brownell <[EMAIL PROTECTED]>
> To: Greg KH <[EMAIL PROTECTED]>
> Date: Thu, 17 Mar 2005 17:59:48 -0800
> Cc: [email protected]
> Subject: [linux-usb-devel] [patch 2.6.11] pxa25x udc updates,
> mostly PM
>
> --Boundary-00=_UYjOCdbIEsNn6c6
> Content-Type: text/plain;
> charset="us-ascii"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline
>
> This supports the newish (as of last summer) pullup and vbus
> session calls, using them to support PM. Also sparse fixes.
> Tested on multiple boards; please merge.
>
> - Dvae
>
> --Boundary-00=_UYjOCdbIEsNn6c6
> Content-Type: text/x-diff;
> charset="us-ascii";
> name="pxa2xx-0312.patch"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: attachment;
> filename="pxa2xx-0312.patch"
>
> This has various updates to the PXA 21x/25x/26x UDC driver.
>
> - Implement the "new" pullup() and vbus_session() methods, and
> use them to keep the UDC 48 MHz clock off much of the time.
>
> * Reworked that ugly Lubbock VBUS IRQ code. Claim both IRQs,
> enable only one at a time; clock the UDC only when VBUS is
> present. (And get rid of rude runtime messages.)
>
> * Implement driver model suspend() and resume() calls. When
> this device suspends, it clocks off the UDC. On boards that
> support it (including Zaurus clamshells, but not Lubbock)
> the D+ pullup is disabled, so the host won't see the device.
>
> - Hmm, the "latest" errata defined some "Must Be One" bits. OK.
>
> - Change the LED support for debugging. It stopped compiling for
> Lubbock a while back. This switches to the standard LED calls
> (so it can work on non-Lubbock hardware), removes the EP0 calls
> (not very useful any more), and for Lubbock now initializes the
> hex leds (U-Boot doesn't enable them, BLOB did).
>
> - "sparse" updates, and get rid of a warning that's pointless
> unless someone's working on DMA support;
>
> Tested on Lubbock (VBUS sensing but no pullup) and some
> Zaurus clamshells (pullup but no VBUS).
>
> Signed-off-by: David Brownell <[EMAIL PROTECTED]>
>
> --- a/drivers/usb/gadget/pxa2xx_udc.c 2005-03-12 16:35:52 -08:00
> +++ b/drivers/usb/gadget/pxa2xx_udc.c 2005-03-12 16:35:52 -08:00
> @@ -310,7 +311,7 @@
> /* flush fifo (mostly for IN buffers) */
> pxa2xx_ep_fifo_flush (_ep);
>
> - ep->desc = 0;
> + ep->desc = NULL;
> ep->stopped = 1;
>
> DBG(DBG_VERBOSE, "%s disabled\n", _ep->name);
> @@ -334,7 +335,7 @@
>
> req = kmalloc (sizeof *req, gfp_flags);
> if (!req)
> - return 0;
> + return NULL;
>
> memset (req, 0, sizeof *req);
> INIT_LIST_HEAD (&req->queue);
> @@ -369,7 +370,11 @@
>
> retval = kmalloc (bytes, gfp_flags &
> ~(__GFP_DMA|__GFP_HIGHMEM));
> if (retval)
> +#ifdef USE_DMA
> *dma = virt_to_bus (retval);
> +#else
> + *dma = (dma_addr_t)~0;
> +#endif
> return retval;
> }
>
> @@ -411,7 +416,6 @@
> static inline void ep0_idle (struct pxa2xx_udc *dev)
> {
> dev->ep0state = EP0_IDLE;
> - LED_EP0_OFF;
> }
>
> static int
> @@ -930,7 +934,7 @@
> case EP0_IN_DATA_PHASE:
> dev->stats.write.ops++;
> if (write_ep0_fifo(ep, req))
> - req = 0;
> + req = NULL;
> break;
>
> case EP0_OUT_DATA_PHASE:
> @@ -940,7 +944,8 @@
> DBG(DBG_VERBOSE, "ep0
> config ack%s\n",
> dev->has_cfr ?
> "" : " raced");
> if (dev->has_cfr)
> - UDCCFR =
> UDCCFR_AREN|UDCCFR_ACM;
> + UDCCFR =
> UDCCFR_AREN|UDCCFR_ACM
> + |UDCCFR_MB1;
> done(ep, req, 0);
> dev->ep0state = EP0_END_XFER;
> local_irq_restore (flags);
> @@ -952,7 +957,7 @@
> &&
> read_ep0_fifo(ep, req))) {
> ep0_idle(dev);
> done(ep, req, 0);
> - req = 0;
> + req = NULL;
> }
> break;
>
> @@ -970,10 +975,10 @@
> } else if ((ep->bEndpointAddress & USB_DIR_IN) != 0
> && (*ep->reg_udccs & UDCCS_BI_TFS) != 0
> && write_fifo(ep, req)) {
> - req = 0;
> + req = NULL;
> } else if ((*ep->reg_udccs & UDCCS_BO_RFS) != 0
> && read_fifo(ep, req)) {
> - req = 0;
> + req = NULL;
> }
>
> if (likely (req && ep->desc) && ep->dma < 0)
> @@ -1094,7 +1099,6 @@
> start_watchdog(ep->dev);
> ep->dev->req_pending = 0;
> ep->dev->ep0state = EP0_STALL;
> - LED_EP0_OFF;
>
> /* and bulk/intr endpoints like dropping stalls too */
> } else {
> @@ -1194,13 +1198,71 @@
> return 0;
> }
>
> +static void stop_activity(struct pxa2xx_udc *, struct
> usb_gadget_driver
> +*); static void udc_enable (struct pxa2xx_udc *); static void
> +udc_disable(struct pxa2xx_udc *);
> +
> +/* We disable the UDC -- and its 48 MHz clock -- whenever it's not
> + * in active use.
> + */
> +static int pullup(struct pxa2xx_udc *udc, int is_active)
> +{
> + is_active = is_active && udc->vbus && udc->pullup;
> + DMSG("%s\n", is_active ? "active" : "inactive");
> + if (is_active)
> + udc_enable(udc);
> + else {
> + if (udc->gadget.speed != USB_SPEED_UNKNOWN) {
> + DMSG("disconnect %s\n", udc->driver
> + ? udc->driver->driver.name
> + : "(no driver)");
> + stop_activity(udc, udc->driver);
> + }
> + udc_disable(udc);
> + }
> + return 0;
> +}
> +
> +/* VBUS reporting logically comes from a transceiver */
> +static int pxa2xx_udc_vbus_session(struct usb_gadget *_gadget, int
> +is_active) {
> + struct pxa2xx_udc *udc;
> +
> + udc = container_of(_gadget, struct pxa2xx_udc, gadget);
> + udc->vbus = is_active = (is_active != 0);
> + DMSG("vbus %s\n", is_active ? "supplied" : "inactive");
> + pullup(udc, is_active);
> + return 0;
> +}
> +
> +/* drivers may have software control over D+ pullup */
> +static int pxa2xx_udc_pullup(struct usb_gadget *_gadget, int
> is_active)
> +{
> + struct pxa2xx_udc *udc;
> +
> + udc = container_of(_gadget, struct pxa2xx_udc, gadget);
> +
> + /* not all boards support pullup control */
> + if (!udc->mach->udc_command)
> + return -EOPNOTSUPP;
> +
> + is_active = (is_active != 0);
> + udc->pullup = is_active;
> + pullup(udc, is_active);
> + return 0;
> +}
> +
> static const struct usb_gadget_ops pxa2xx_udc_ops = {
> - .get_frame = pxa2xx_udc_get_frame,
> - .wakeup = pxa2xx_udc_wakeup,
> - // current versions must always be self-powered
> + .get_frame = pxa2xx_udc_get_frame,
> + .wakeup = pxa2xx_udc_wakeup,
> + .vbus_session = pxa2xx_udc_vbus_session,
> + .pullup = pxa2xx_udc_pullup,
> +
> + // .vbus_draw ... boards may consume current from VBUS, up to
> + // 100-500mA based on config. the 500uA suspend ceiling means
> + // that exclusively vbus-powered PXA designs violate USB specs.
> };
>
> -
> /*------------------------------------------------------------
> -------------*/
>
> #ifdef CONFIG_USB_GADGET_DEBUG_FILES
> @@ -1427,7 +1489,7 @@
> if (i != 0)
> list_add_tail (&ep->ep.ep_list,
> &dev->gadget.ep_list);
>
> - ep->desc = 0;
> + ep->desc = NULL;
> ep->stopped = 0;
> INIT_LIST_HEAD (&ep->queue);
> ep->pio_irqs = ep->dma_irqs = 0;
> @@ -1446,6 +1508,7 @@
> #ifdef CONFIG_ARCH_PXA
> /* Enable clock for USB device */
> pxa_set_cken(CKEN11_USB, 1);
> + udelay(5);
> #endif
>
> /* try to clear these bits before we enable the udc */
> @@ -1469,7 +1532,7 @@
> /* pxa255 (a0+) can avoid a set_config race that could
> * prevent gadget drivers from configuring correctly
> */
> - UDCCFR = UDCCFR_ACM;
> + UDCCFR = UDCCFR_ACM | UDCCFR_MB1;
> } else {
> /* "USB test mode" for pxa250 errata 40-42
> (stepping a0, a1)
> * which could result in missing packets and interrupts.
> @@ -1498,18 +1561,13 @@
> }
> #endif
>
> - /* caller must be able to sleep in order to cope
> - * with startup transients.
> - */
> - msleep(100);
> -
> /* enable suspend/resume and reset irqs */
> udc_clear_mask_UDCCR(UDCCR_SRM | UDCCR_REM);
>
> /* enable ep0 irqs */
> UICR0 &= ~UICR0_IM0;
>
> - /* if hardware supports it, connect to usb and wait for host */
> + /* if hardware supports it, pullup D+ and wait for reset */
> let_usb_appear();
> }
>
> @@ -1540,6 +1598,7 @@
> /* first hook up the driver ... */
> dev->driver = driver;
> dev->gadget.dev.driver = &driver->driver;
> + dev->pullup = 1;
>
> device_add (&dev->gadget.dev);
> retval = driver->bind(&dev->gadget);
> @@ -1548,18 +1607,17 @@
> driver->driver.name, retval);
> device_del (&dev->gadget.dev);
>
> - dev->driver = 0;
> - dev->gadget.dev.driver = 0;
> + dev->driver = NULL;
> + dev->gadget.dev.driver = NULL;
> return retval;
> }
> device_create_file(dev->dev, &dev_attr_function);
>
> /* ... then enable host detection and ep0; and we're ready
> * for set_configuration as well as eventual disconnect.
> - * NOTE: this shouldn't power up until later.
> */
> DMSG("registered gadget driver '%s'\n", driver->driver.name);
> - udc_enable(dev);
> + pullup(dev, 1);
> dump_state(dev);
> return 0;
> }
> @@ -1572,7 +1630,7 @@
>
> /* don't disconnect drivers more than once */
> if (dev->gadget.speed == USB_SPEED_UNKNOWN)
> - driver = 0;
> + driver = NULL;
> dev->gadget.speed = USB_SPEED_UNKNOWN;
>
> /* prevent new request submissions, kill any
> outstanding requests */ @@ -1603,12 +1661,12 @@
> return -EINVAL;
>
> local_irq_disable();
> - udc_disable(dev);
> + pullup(dev, 0);
> stop_activity(dev, driver);
> local_irq_enable();
>
> driver->unbind(&dev->gadget);
> - dev->driver = 0;
> + dev->driver = NULL;
>
> device_del (&dev->gadget.dev);
> device_remove_file(dev->dev, &dev_attr_function);
> @@ -1624,61 +1682,41 @@
>
> #ifdef CONFIG_ARCH_LUBBOCK
>
> -/* Lubbock can report connect or disconnect irqs. Likely
> more hardware
> - * could support it as a timer callback.
> - *
> - * FIXME for better power management, keep the hardware powered down
> - * until a host is powering the link. means scheduling work later
> - * in some task that can udc_enable().
> +/* Lubbock has separate connect and disconnect irqs. More typical
> +designs
> + * use one GPIO as the VBUS IRQ, and another to control the
> D+ pullup.
> */
>
> -#define enable_disconnect_irq() \
> - if (machine_is_lubbock()) { enable_irq(LUBBOCK_USB_DISC_IRQ); }
> -#define disable_disconnect_irq() \
> - if (machine_is_lubbock()) { disable_irq(LUBBOCK_USB_DISC_IRQ); }
> -
> static irqreturn_t
> -usb_connection_irq(int irq, void *_dev, struct pt_regs *r)
> +lubbock_vbus_irq(int irq, void *_dev, struct pt_regs *r)
> {
> struct pxa2xx_udc *dev = _dev;
> + int vbus;
>
> dev->stats.irqs++;
> HEX_DISPLAY(dev->stats.irqs);
> -
> - if (!is_usb_connected()) {
> - LED_CONNECTED_OFF;
> - disable_disconnect_irq();
> - /* report disconnect just once */
> - if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
> - DMSG("disconnect %s\n",
> - dev->driver ?
> dev->driver->driver.name : 0);
> - stop_activity(dev, dev->driver);
> -
> - // udc_disable (dev);
> - // no more udc irqs
> - // maybe "ACTION=disconnect
> /sbin/hotplug gadget".
> - }
> - } else if (dev->gadget.speed == USB_SPEED_UNKNOWN) {
> + switch (irq) {
> + case LUBBOCK_USB_IRQ:
> LED_CONNECTED_ON;
> -
> - DMSG("?? connect irq ??\n");
> -
> - // if there's no driver bound, ignore; else
> - // udc_enable (dev);
> - // UDC irqs drive the rest.
> - // maybe "ACTION=connect /sbin/hotplug gadget".
> + vbus = 1;
> + disable_irq(LUBBOCK_USB_IRQ);
> + enable_irq(LUBBOCK_USB_DISC_IRQ);
> + break;
> + case LUBBOCK_USB_DISC_IRQ:
> + LED_CONNECTED_OFF;
> + vbus = 0;
> + disable_irq(LUBBOCK_USB_DISC_IRQ);
> + enable_irq(LUBBOCK_USB_IRQ);
> + break;
> + default:
> + return IRQ_NONE;
> }
> +
> + pxa2xx_udc_vbus_session(&dev->gadget, vbus);
> return IRQ_HANDLED;
> }
>
> #endif
>
> -#ifndef enable_disconnect_irq
> -#warning USB disconnect() is not yet reported.
> -#define enable_disconnect_irq() do {} while (0)
> -#define disable_disconnect_irq() do {} while (0)
> -#endif
> -
>
>
> /*------------------------------------------------------------
> -------------*/
>
> @@ -1720,7 +1758,7 @@
> } u;
>
> if (list_empty(&ep->queue))
> - req = 0;
> + req = NULL;
> else
> req = list_entry(ep->queue.next, struct
> pxa2xx_request, queue);
>
> @@ -1764,14 +1802,11 @@
> goto bad_setup;
>
> got_setup:
> - le16_to_cpus (&u.r.wValue);
> - le16_to_cpus (&u.r.wIndex);
> - le16_to_cpus (&u.r.wLength);
> -
> - LED_EP0_ON;
> DBG(DBG_VERBOSE, "SETUP %02x.%02x v%04x
> i%04x l%04x\n",
> u.r.bRequestType, u.r.bRequest,
> - u.r.wValue, u.r.wIndex, u.r.wLength);
> + le16_to_cpu(u.r.wValue),
> + le16_to_cpu(u.r.wIndex),
> + le16_to_cpu(u.r.wLength));
>
> /* cope with automagic for some
> standard requests. */
> dev->req_std = (u.r.bRequestType &
> USB_TYPE_MASK)
> @@ -1803,7 +1838,8 @@
> * - ep reset doesn't
> include halt(?).
> */
> DMSG("broken
> set_interface (%d/%d)\n",
> - u.r.wIndex, u.r.wValue);
> + le16_to_cpu(u.r.wIndex),
> +
> le16_to_cpu(u.r.wValue));
> goto config_change;
> }
> break;
> @@ -1847,7 +1883,6 @@
> ep0start(dev,
> UDCCS0_FST|UDCCS0_FTF, "stall");
> start_watchdog(dev);
> dev->ep0state = EP0_STALL;
> - LED_EP0_OFF;
>
> /* deferred i/o == no response yet */
> } else if (dev->req_pending) {
> @@ -1948,7 +1983,7 @@
> req = list_entry(ep->queue.next,
> struct pxa2xx_request, queue);
> else
> - req = 0;
> + req = NULL;
>
> // TODO check FST handling
>
> @@ -2050,8 +2085,6 @@
>
> if ((UDCCR & UDCCR_UDA) == 0) {
> DBG(DBG_VERBOSE, "USB reset start\n");
> - if (dev->gadget.speed !=
> USB_SPEED_UNKNOWN)
> - disable_disconnect_irq();
>
> /* reset driver and endpoints,
> * in case that's not yet done
> @@ -2059,12 +2092,11 @@
> stop_activity (dev, dev->driver);
>
> } else {
> - INFO("USB reset\n");
> + DBG(DBG_VERBOSE, "USB reset end\n");
> dev->gadget.speed = USB_SPEED_FULL;
> LED_CONNECTED_ON;
> memset(&dev->stats, 0, sizeof
> dev->stats);
> /* driver and endpoints are
> still reset */
> - enable_disconnect_irq();
> }
>
> } else {
> @@ -2478,6 +2548,8 @@
> udc_disable(dev);
> udc_reinit(dev);
>
> + dev->vbus = is_usb_connected();
> +
> /* irq setup after old hardware state is cleaned up */
> retval = request_irq(IRQ_USB, pxa2xx_udc_irq,
> SA_INTERRUPT, driver_name, dev);
> @@ -2490,18 +2562,32 @@
>
> #ifdef CONFIG_ARCH_LUBBOCK
> if (machine_is_lubbock()) {
> - disable_irq(LUBBOCK_USB_DISC_IRQ);
> retval = request_irq(LUBBOCK_USB_DISC_IRQ,
> - usb_connection_irq,
> - SA_INTERRUPT /* OOPSING |
> SA_SAMPLE_RANDOM */,
> + lubbock_vbus_irq,
> + SA_INTERRUPT | SA_SAMPLE_RANDOM,
> driver_name, dev);
> if (retval != 0) {
> - enable_irq(LUBBOCK_USB_DISC_IRQ);
> printk(KERN_ERR "%s: can't get irq %i,
> err %d\n",
> driver_name,
> LUBBOCK_USB_DISC_IRQ, retval);
> +lubbock_fail0:
> + free_irq(IRQ_USB, dev);
> return -EBUSY;
> }
> - dev->got_disc = 1;
> + retval = request_irq(LUBBOCK_USB_IRQ,
> + lubbock_vbus_irq,
> + SA_INTERRUPT | SA_SAMPLE_RANDOM,
> + driver_name, dev);
> + if (retval != 0) {
> + printk(KERN_ERR "%s: can't get irq %i,
> err %d\n",
> + driver_name, LUBBOCK_USB_IRQ, retval);
> + free_irq(LUBBOCK_USB_DISC_IRQ, dev);
> + goto lubbock_fail0;
> + }
> +#ifdef DEBUG
> + /* with U-Boot (but not BLOB), hex is off by default */
> + HEX_DISPLAY(dev->stats.irqs);
> + LUB_DISC_BLNK_LED &= 0xff;
> +#endif
> }
> #endif
> create_proc_files();
> @@ -2510,7 +2596,7 @@
> }
> static int __exit pxa2xx_udc_remove(struct device *_dev)
> {
> - struct pxa2xx_udc *dev = _dev->driver_data;
> + struct pxa2xx_udc *dev = dev_get_drvdata(_dev);
>
> udc_disable(dev);
> remove_proc_files();
> @@ -2520,15 +2606,57 @@
> free_irq(IRQ_USB, dev);
> dev->got_irq = 0;
> }
> - if (machine_is_lubbock() && dev->got_disc) {
> + if (machine_is_lubbock()) {
> free_irq(LUBBOCK_USB_DISC_IRQ, dev);
> - dev->got_disc = 0;
> + free_irq(LUBBOCK_USB_IRQ, dev);
> + }
> + dev_set_drvdata(_dev, NULL);
> + the_controller = NULL;
> + return 0;
> +}
> +
> +/*-----------------------------------------------------------
> ----------
> +----*/
> +
> +#ifdef CONFIG_PM
> +
> +/* USB suspend (controlled by the host) and system suspend
> (controlled
> + * by the PXA) don't necessarily work well together. If USB
> is active,
> + * the 48 MHz clock is required; so the system can't enter
> 33 MHz idle
> + * mode, or any deeper PM saving state.
> + *
> + * For now, we punt and forcibly disconnect from the USB
> host when PXA
> + * enters any suspend state. While we're disconnected, we always
> +disable
> + * the 48MHz USB clock ... allowing PXA sleep and/or 33 MHz
> idle states.
> + * Boards without software pullup control shouldn't use those states.
> + * VBUS IRQs should probably be ignored so that the PXA
> device just acts
> + * "dead" to USB hosts until system resume.
> + */
> +static int pxa2xx_udc_suspend(struct device *dev, u32 state,
> u32 level)
> +{
> + struct pxa2xx_udc *udc = dev_get_drvdata(dev);
> +
> + if (level == SUSPEND_POWER_DOWN) {
> + if (!udc->mach->udc_command)
> + WARN("USB host won't detect disconnect!\n");
> + pullup(udc, 0);
> }
> - dev_set_drvdata(_dev, 0);
> - the_controller = 0;
> return 0;
> }
>
> +static int pxa2xx_udc_resume(struct device *dev, u32 level)
> +{
> + struct pxa2xx_udc *udc = dev_get_drvdata(dev);
> +
> + if (level == RESUME_POWER_ON)
> + pullup(udc, 1);
> + return 0;
> +}
> +
> +#else
> +#define pxa2xx_udc_suspend NULL
> +#define pxa2xx_udc_resume NULL
> +#endif
> +
>
> /*------------------------------------------------------------
> -------------*/
>
> static struct device_driver udc_driver = {
> @@ -2536,10 +2664,8 @@
> .bus = &platform_bus_type,
> .probe = pxa2xx_udc_probe,
> .remove = __exit_p(pxa2xx_udc_remove),
> -
> - // FIXME power management support
> - // .suspend = ... disable UDC
> - // .resume = ... re-enable UDC
> + .suspend = pxa2xx_udc_suspend,
> + .resume = pxa2xx_udc_resume,
> };
>
> static int __init udc_init(void)
> --- a/drivers/usb/gadget/pxa2xx_udc.h 2005-03-12 16:35:52 -08:00
> +++ b/drivers/usb/gadget/pxa2xx_udc.h 2005-03-12 16:35:52 -08:00
> @@ -40,6 +40,9 @@
> #define UDCCFR_AREN (1 << 7) /* ACK response enable (now) */
> #define UDCCFR_ACM (1 << 2) /* ACK control mode
> (wait for AREN) */
>
> +/* latest pxa255 errata define new "must be one" bits in UDCCFR */
> +#define UDCCFR_MB1 (0xff & ~(UDCCFR_AREN|UDCCFR_ACM))
> +
>
> /*------------------------------------------------------------
> -------------*/
>
> struct pxa2xx_udc;
> @@ -120,7 +123,8 @@
> enum ep0_state ep0state;
> struct udc_stats stats;
> unsigned got_irq : 1,
> - got_disc : 1,
> + vbus : 1,
> + pullup : 1,
> has_cfr : 1,
> req_pending : 1,
> req_std : 1,
> @@ -143,14 +147,7 @@
>
> #ifdef DEBUG
> #define HEX_DISPLAY(n) if (machine_is_lubbock()) {
> LUB_HEXLED = (n); }
> -
> -#define LED_CONNECTED_ON if (machine_is_lubbock()) { \
> - DISCRETE_LED_ON(D26); }
> -#define LED_CONNECTED_OFF if(machine_is_lubbock()) { \
> - DISCRETE_LED_OFF(D26); LUB_HEXLED = 0; }
> -#define LED_EP0_ON if (machine_is_lubbock()) {
> DISCRETE_LED_ON(D25); }
> -#define LED_EP0_OFF if (machine_is_lubbock()) {
> DISCRETE_LED_OFF(D25); }
> -#endif /* DEBUG */
> +#endif
>
> #endif
>
> @@ -161,13 +158,19 @@
> #define HEX_DISPLAY(n) do {} while(0)
> #endif
>
> +#ifdef DEBUG
> +#include <asm/leds.h>
> +
> +#define LED_CONNECTED_ON leds_event(led_green_on)
> +#define LED_CONNECTED_OFF do { \
> + leds_event(led_green_off); \
> + HEX_DISPLAY(0); \
> + } while(0)
> +#endif
> +
> #ifndef LED_CONNECTED_ON
> #define LED_CONNECTED_ON do {} while(0)
> #define LED_CONNECTED_OFF do {} while(0)
> -#endif
> -#ifndef LED_EP0_ON
> -#define LED_EP0_ON do {} while (0)
> -#define LED_EP0_OFF do {} while (0)
> #endif
>
>
> /*------------------------------------------------------------
> -------------*/
>
> --Boundary-00=_UYjOCdbIEsNn6c6--
>
>
>
> --__--__--
>
> _______________________________________________
> [email protected]
> To unsubscribe, use the last form field at:
> https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
>
>
> End of linux-usb-devel Digest
>
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_ide95&alloc_id396&op=click
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel