diff options
author | Koen Kooi <koen@openembedded.org> | 2008-11-22 18:59:33 +0100 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2008-11-22 18:59:33 +0100 |
commit | 13a2a9b12b07f1d86f523dc242e160c2592f904d (patch) | |
tree | ef9cd9e00fb1fa30ee8d68aeb5cfd5105d674a28 /packages/linux/linux-omap | |
parent | 5efdc93f5c6558c9ec001b21ccf649f0796a03e6 (diff) |
linux-omap git: update to 2.6.28rc6, remove patches that were applied
Diffstat (limited to 'packages/linux/linux-omap')
-rw-r--r-- | packages/linux/linux-omap/beagleboard/defconfig | 24 | ||||
-rw-r--r-- | packages/linux/linux-omap/fix-asoc.diff | 130 | ||||
-rw-r--r-- | packages/linux/linux-omap/fix-mmc.diff | 39 | ||||
-rw-r--r-- | packages/linux/linux-omap/musb-dma-iso-in.eml | 138 | ||||
-rw-r--r-- | packages/linux/linux-omap/musb-fix-endpoints.diff | 197 | ||||
-rw-r--r-- | packages/linux/linux-omap/musb-fix-multiple-bulk-transfers.diff | 194 |
6 files changed, 9 insertions, 713 deletions
diff --git a/packages/linux/linux-omap/beagleboard/defconfig b/packages/linux/linux-omap/beagleboard/defconfig index ce06b21672..cf6cc12d6e 100644 --- a/packages/linux/linux-omap/beagleboard/defconfig +++ b/packages/linux/linux-omap/beagleboard/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.28-rc3-omap1 -# Tue Nov 11 15:45:33 2008 +# Linux kernel version: 2.6.28-rc4-omap1 +# Mon Nov 17 15:37:33 2008 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -801,7 +801,7 @@ CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_GPIO is not set +CONFIG_KEYBOARD_GPIO=y CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y @@ -1314,6 +1314,7 @@ CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=14 CONFIG_FB_OMAP2=y CONFIG_FB_OMAP2_DEBUG=y @@ -1323,11 +1324,11 @@ CONFIG_FB_OMAP2_DEBUG=y # OMAP2/3 Display Device Drivers # CONFIG_PANEL_DVI=y -# CONFIG_PANEL_DVI_LOWLOWRES is not set -# CONFIG_PANEL_DVI_LOWRES is not set -CONFIG_PANEL_DVI_HIGHRES=y -# CONFIG_PANEL_DVI_VERYHIGHRES is not set -# CONFIG_PANEL_SDP3430 is not set +# CONFIG_PANEL_DVI_640X480 is not set +# CONFIG_PANEL_DVI_800X600 is not set +CONFIG_PANEL_DVI_1024X768=y +# CONFIG_PANEL_DVI_1280X1024 is not set +# CONFIG_PANEL_SHARP_LS037V7DW01 is not set # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # @@ -1734,14 +1735,7 @@ CONFIG_RTC_DRV_TWL4030=y # on-CPU RTC drivers # # CONFIG_DMADEVICES is not set - -# -# Voltage and Current regulators -# # CONFIG_REGULATOR is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_BQ24022 is not set # CONFIG_UIO is not set # diff --git a/packages/linux/linux-omap/fix-asoc.diff b/packages/linux/linux-omap/fix-asoc.diff deleted file mode 100644 index 4948e932fb..0000000000 --- a/packages/linux/linux-omap/fix-asoc.diff +++ /dev/null @@ -1,130 +0,0 @@ -From linux-omap-owner@vger.kernel.org Mon Nov 10 23:48:17 2008 -Date: Mon, 10 Nov 2008 14:36:32 -0800 -From: "Steve Sakoman" <sakoman@gmail.com> -To: "Philip Balister" <philip@balister.org> -Subject: Re: ASOC and the Beagle -Cc: "linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>, - "Tony Lindgren" <tony@atomide.com> - -On Mon, Nov 10, 2008 at 12:38 PM, Steve Sakoman <sakoman@gmail.com> wrote: -> On Mon, Nov 10, 2008 at 7:10 AM, Philip Balister <philip@balister.org> wrote: ->> A few weeks ago kernels built from git would detect the sound hardware and ->> actually work. ->> ->> Yesterday I build a kernel and the sound hardware is no longer detected. Is ->> there an easy way to fix this? ->> ->> Sorry I'm so vague, I don't have all the revision data handy .... -> -> I just noticed this too. -> -> It seems that the Kconfig for soc/omap got damaged in the merge. -> -> The fix is simple, patch below. - -Next time I should build test before posting :-) - -Turns out that the Makefile for soc/omap and the Kconfig and Makefile -for soc/codec also got screwed up in the merge, so those need to be -fixed. - -The complete fix is: - -diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig -index 38a0e3b..5df7402 100644 ---- a/sound/soc/codecs/Kconfig -+++ b/sound/soc/codecs/Kconfig -@@ -10,6 +10,7 @@ config SND_SOC_ALL_CODECS - select SND_SOC_TLV320AIC23 - select SND_SOC_TLV320AIC26 - select SND_SOC_TLV320AIC3X -+ select SND_SOC_TWL4030 - select SND_SOC_UDA1380 - select SND_SOC_WM8510 - select SND_SOC_WM8580 -@@ -75,6 +76,10 @@ config SND_SOC_TLV320AIC3X - tristate - depends on I2C - -+config SND_SOC_TWL4030 -+ tristate -+ depends on TWL4030_CORE -+ - config SND_SOC_UDA1380 - tristate - -diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile -index 90f0a58..3b9b58a 100644 ---- a/sound/soc/codecs/Makefile -+++ b/sound/soc/codecs/Makefile -@@ -7,6 +7,7 @@ snd-soc-ssm2602-objs := ssm2602.o - snd-soc-tlv320aic23-objs := tlv320aic23.o - snd-soc-tlv320aic26-objs := tlv320aic26.o - snd-soc-tlv320aic3x-objs := tlv320aic3x.o -+snd-soc-twl4030-objs := twl4030.o - snd-soc-uda1380-objs := uda1380.o - snd-soc-wm8510-objs := wm8510.o - snd-soc-wm8580-objs := wm8580.o -@@ -29,6 +30,7 @@ obj-$(CONFIG_SND_SOC_SSM2602) += snd-soc-ssm2602.o - obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o - obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o - obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o -+obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o - obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o - obj-$(CONFIG_SND_SOC_WM8510) += snd-soc-wm8510.o - obj-$(CONFIG_SND_SOC_WM8580) += snd-soc-wm8580.o -diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig -index 8b7766b..0daeee4 100644 ---- a/sound/soc/omap/Kconfig -+++ b/sound/soc/omap/Kconfig -@@ -14,6 +14,14 @@ config SND_OMAP_SOC_N810 - help - Say Y if you want to add support for SoC audio on Nokia N810. - -+config SND_OMAP_SOC_OMAP3_BEAGLE -+ tristate "SoC Audio support for OMAP3 Beagle" -+ depends on SND_OMAP_SOC && MACH_OMAP3_BEAGLE -+ select SND_OMAP_SOC_MCBSP -+ select SND_SOC_TWL4030 -+ help -+ Say Y if you want to add support for SoC audio on the Beagleboard. -+ - config SND_OMAP_SOC_OSK5912 - tristate "SoC Audio support for omap osk5912" - depends on SND_OMAP_SOC && MACH_OMAP_OSK -@@ -21,3 +29,13 @@ config SND_OMAP_SOC_OSK5912 - select SND_SOC_TLV320AIC23 - help - Say Y if you want to add support for SoC audio on osk5912. -+ -+config SND_OMAP_SOC_OVERO -+ tristate "SoC Audio support for Gumstix Overo" -+ depends on SND_OMAP_SOC && MACH_OVERO -+ select SND_OMAP_SOC_MCBSP -+ select SND_SOC_TWL4030 -+ help -+ Say Y if you want to add support for SoC audio on the Gumstix Overo. -+ -+ -diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile -index e09d1f2..4bae404 100644 ---- a/sound/soc/omap/Makefile -+++ b/sound/soc/omap/Makefile -@@ -7,7 +7,12 @@ obj-$(CONFIG_SND_OMAP_SOC_MCBSP) += snd-soc-omap-mcbsp.o - - # OMAP Machine Support - snd-soc-n810-objs := n810.o -+snd-soc-omap3beagle-objs := omap3beagle.o - snd-soc-osk5912-objs := osk5912.o -+snd-soc-overo-objs := overo.o - - obj-$(CONFIG_SND_OMAP_SOC_N810) += snd-soc-n810.o -+obj-$(CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE) += snd-soc-omap3beagle.o - obj-$(CONFIG_SND_OMAP_SOC_OSK5912) += snd-soc-osk5912.o -+obj-$(CONFIG_SND_OMAP_SOC_OVERO) += snd-soc-overo.o -+ --- -To unsubscribe from this list: send the line "unsubscribe linux-omap" 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/packages/linux/linux-omap/fix-mmc.diff b/packages/linux/linux-omap/fix-mmc.diff deleted file mode 100644 index dfc531c3ef..0000000000 --- a/packages/linux/linux-omap/fix-mmc.diff +++ /dev/null @@ -1,39 +0,0 @@ -Oops.. Haven't thought to try it without gpio_cd set up, in which case c->mmc -is not set initialized.. Please try the following patch: - - -diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c -index 0ea6ba6..626d668 100644 ---- a/arch/arm/mach-omap2/mmc-twl4030.c -+++ b/arch/arm/mach-omap2/mmc-twl4030.c -@@ -239,6 +239,7 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on, - u32 reg; - int ret = 0; - struct twl_mmc_controller *c = &hsmmc[0]; -+ struct omap_mmc_platform_data *mmc = dev->platform_data; - - if (power_on) { - if (cpu_is_omap2430()) { -@@ -250,7 +251,7 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on, - omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1); - } - -- if (c->mmc->slots[0].internal_clock) { -+ if (mmc->slots[0].internal_clock) { - reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); - reg |= OMAP2_MMCSDIO1ADPCLKISEL; - omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0); -@@ -293,11 +294,11 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on, - static int twl_mmc2_set_power(struct device *dev, int slot, int power_on, int vdd) - { - int ret; -- - struct twl_mmc_controller *c = &hsmmc[1]; -+ struct omap_mmc_platform_data *mmc = dev->platform_data; - - if (power_on) { -- if (c->mmc->slots[0].internal_clock) { -+ if (mmc->slots[0].internal_clock) { - u32 reg; - - reg = omap_ctrl_readl(control_devconf1_offset); diff --git a/packages/linux/linux-omap/musb-dma-iso-in.eml b/packages/linux/linux-omap/musb-dma-iso-in.eml deleted file mode 100644 index 56fc827a5d..0000000000 --- a/packages/linux/linux-omap/musb-dma-iso-in.eml +++ /dev/null @@ -1,138 +0,0 @@ -Fixes blurred capture images in dma mode. Isochronous error field in -urb and source data buffer pointer were not updated properly in dma -mode. - -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> ---- -diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c -index 08e421f..a481d54 100644 ---- a/drivers/usb/musb/musb_host.c -+++ b/drivers/usb/musb/musb_host.c -@@ -1505,10 +1505,29 @@ void musb_host_rx(struct musb *musb, u8 epnum) - musb_writew(hw_ep->regs, MUSB_RXCSR, val); - - #ifdef CONFIG_USB_INVENTRA_DMA -+ if (usb_pipeisoc(pipe)) { -+ struct usb_iso_packet_descriptor *d; -+ -+ d = urb->iso_frame_desc + qh->iso_idx; -+ d->actual_length = xfer_len; -+ -+ /* even if there was an error, we did the dma -+ * for iso_frame_desc->length -+ */ -+ if (d->status != EILSEQ && d->status != -EOVERFLOW) -+ d->status = 0; -+ -+ if (++qh->iso_idx >= urb->number_of_packets) -+ done = true; -+ else -+ done = false; -+ -+ } else { - /* done if urb buffer is full or short packet is recd */ - done = (urb->actual_length + xfer_len >= - urb->transfer_buffer_length - || dma->actual_len < qh->maxpacket); -+ } - - /* send IN token for next packet, without AUTOREQ */ - if (!done) { -@@ -1545,7 +1564,8 @@ void musb_host_rx(struct musb *musb, u8 epnum) - if (dma) { - struct dma_controller *c; - u16 rx_count; -- int ret; -+ int ret, length; -+ dma_addr_t buf; - - rx_count = musb_readw(epio, MUSB_RXCOUNT); - -@@ -1558,6 +1578,35 @@ void musb_host_rx(struct musb *musb, u8 epnum) - - c = musb->dma_controller; - -+ if (usb_pipeisoc(pipe)) { -+ int status = 0; -+ struct usb_iso_packet_descriptor *d; -+ -+ d = urb->iso_frame_desc + qh->iso_idx; -+ -+ if (iso_err) { -+ status = -EILSEQ; -+ urb->error_count++; -+ } -+ if (rx_count > d->length) { -+ if (status == 0) { -+ status = -EOVERFLOW; -+ urb->error_count++; -+ } -+ DBG(2, "** OVERFLOW %d into %d\n",\ -+ rx_count, d->length); -+ -+ length = d->length; -+ } else -+ length = rx_count; -+ d->status = status; -+ buf = urb->transfer_dma + d->offset; -+ } else { -+ length = rx_count; -+ buf = urb->transfer_dma + -+ urb->actual_length; -+ } -+ - dma->desired_mode = 0; - #ifdef USE_MODE1 - /* because of the issue below, mode 1 will -@@ -1569,6 +1618,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) - urb->actual_length) - > qh->maxpacket) - dma->desired_mode = 1; -+ if (rx_count < hw_ep->max_packet_sz_rx) { -+ length = rx_count; -+ dma->bDesiredMode = 0; -+ } else { -+ length = urb->transfer_buffer_length; -+ } - #endif - - /* Disadvantage of using mode 1: -@@ -1606,12 +1661,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) - */ - ret = c->channel_program( - dma, qh->maxpacket, -- dma->desired_mode, -- urb->transfer_dma -- + urb->actual_length, -- (dma->desired_mode == 0) -- ? rx_count -- : urb->transfer_buffer_length); -+ dma->desired_mode, buf, length); - - if (!ret) { - c->channel_release(dma); -@@ -1628,19 +1678,6 @@ void musb_host_rx(struct musb *musb, u8 epnum) - } - } - -- if (dma && usb_pipeisoc(pipe)) { -- struct usb_iso_packet_descriptor *d; -- int iso_stat = status; -- -- d = urb->iso_frame_desc + qh->iso_idx; -- d->actual_length += xfer_len; -- if (iso_err) { -- iso_stat = -EILSEQ; -- urb->error_count++; -- } -- d->status = iso_stat; -- } -- - finish: - urb->actual_length += xfer_len; - qh->offset += xfer_len; --- -To unsubscribe from this list: send the line "unsubscribe linux-omap" 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/packages/linux/linux-omap/musb-fix-endpoints.diff b/packages/linux/linux-omap/musb-fix-endpoints.diff deleted file mode 100644 index 5d1201f014..0000000000 --- a/packages/linux/linux-omap/musb-fix-endpoints.diff +++ /dev/null @@ -1,197 +0,0 @@ -From: Ajay Kumar Gupta <ajay.gupta@ti.com> -To: linux-usb@vger.kernel.org -Cc: linux-omap@vger.kernel.org, david-b@pacbell.net, me@felipebalbi.com, - Ajay Kumar Gupta <ajay.gupta@ti.com> -Subject: [PATCH] MUSB: BULK request on different available endpoints -Date: Tue, 7 Oct 2008 11:12:24 +0530 - -Fixes co-working issue of usb serial device with usb/net devices while -oter endpoints are free and can be used.This patch implements the policy -that if endpoint resources are available then different BULK request goes -to different endpoint otherwise they are multiplexed to one reserved -endpoint as currently done. - -NAK limit scheme has to be added for multiplexed BULK request scenario -to avoid endpoint starvation due to usb/net devices. - -musb->periodic[] flag setting is also updated.It use to set this flag for -an endpoint even when only rx or tx is used.Now flag setting is done on -rx/tx basis of an endpoint. - -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> ---- - drivers/usb/musb/musb_host.c | 94 ++++++++++++++++++++++++------------------ - drivers/usb/musb/musb_host.h | 1 + - 2 files changed, 55 insertions(+), 40 deletions(-) - ---- /tmp/musb_host.c 2008-10-07 10:10:49.000000000 +0200 -+++ git/drivers/usb/musb/musb_host.c 2008-10-07 10:13:59.000000000 +0200 -@@ -378,27 +378,32 @@ - - switch (qh->type) { - -+ case USB_ENDPOINT_XFER_CONTROL: -+ case USB_ENDPOINT_XFER_BULK: -+ /* fifo policy for these lists, except that NAKing -+ * should rotate a qh to the end (for fairness). -+ */ -+ if (qh->mux == 1) { -+ head = qh->ring.prev; -+ list_del(&qh->ring); -+ kfree(qh); -+ qh = first_qh(head); -+ break; -+ } - case USB_ENDPOINT_XFER_ISOC: - case USB_ENDPOINT_XFER_INT: - /* this is where periodic bandwidth should be - * de-allocated if it's tracked and allocated; - * and where we'd update the schedule tree... - */ -- musb->periodic[ep->epnum] = NULL; -+ if (is_in) -+ musb->periodic[2 * ep->epnum - 2] = NULL; -+ else -+ musb->periodic[2 * ep->epnum - 1] = NULL; - kfree(qh); - qh = NULL; - break; - -- case USB_ENDPOINT_XFER_CONTROL: -- case USB_ENDPOINT_XFER_BULK: -- /* fifo policy for these lists, except that NAKing -- * should rotate a qh to the end (for fairness). -- */ -- head = qh->ring.prev; -- list_del(&qh->ring); -- kfree(qh); -- qh = first_qh(head); -- break; - } - } - return qh; -@@ -1728,22 +1733,9 @@ - u16 maxpacket; - - /* use fixed hardware for control and bulk */ -- switch (qh->type) { -- case USB_ENDPOINT_XFER_CONTROL: -+ if (qh->type == USB_ENDPOINT_XFER_CONTROL) { - head = &musb->control; - hw_ep = musb->control_ep; -- break; -- case USB_ENDPOINT_XFER_BULK: -- hw_ep = musb->bulk_ep; -- if (is_in) -- head = &musb->in_bulk; -- else -- head = &musb->out_bulk; -- break; -- } -- if (head) { -- idle = list_empty(head); -- list_add_tail(&qh->ring, head); - goto success; - } - -@@ -1778,7 +1770,8 @@ - for (epnum = 1; epnum < musb->nr_endpoints; epnum++) { - int diff; - -- if (musb->periodic[epnum]) -+ if ((is_in && musb->periodic[2 * epnum - 2]) || -+ (!is_in && musb->periodic[2 * epnum - 1])) - continue; - hw_ep = &musb->endpoints[epnum]; - if (hw_ep == musb->bulk_ep) -@@ -1789,19 +1782,36 @@ - else - diff = hw_ep->max_packet_sz_tx - maxpacket; - -- if (diff > 0 && best_diff > diff) { -+ if (diff >= 0 && best_diff > diff) { - best_diff = diff; - best_end = epnum; - } - } -- if (best_end < 0) -+ /* use bulk reserved ep1 if no other ep is free*/ -+ if (best_end < 0 && qh->type == USB_ENDPOINT_XFER_BULK) { -+ hw_ep = musb->bulk_ep; -+ if (is_in) -+ head = &musb->in_bulk; -+ else -+ head = &musb->out_bulk; -+ goto success; -+ } else if (best_end < 0) - return -ENOSPC; - - idle = 1; -+ qh->mux = 0; - hw_ep = musb->endpoints + best_end; -- musb->periodic[best_end] = qh; -- DBG(4, "qh %p periodic slot %d\n", qh, best_end); -+ if (is_in) -+ musb->periodic[2 * best_end - 2] = qh; -+ else -+ musb->periodic[2 * best_end - 1] = qh; -+ DBG(4, "qh %p periodic slot %d%s\n", qh, best_end, is_in ? "Rx" : "Tx"); - success: -+ if (head) { -+ idle = list_empty(head); -+ list_add_tail(&qh->ring, head); -+ qh->mux = 1; -+ } - qh->hw_ep = hw_ep; - qh->hep->hcpriv = qh; - if (idle) -@@ -2065,11 +2075,13 @@ - sched = &musb->control; - break; - case USB_ENDPOINT_XFER_BULK: -- if (usb_pipein(urb->pipe)) -- sched = &musb->in_bulk; -- else -- sched = &musb->out_bulk; -- break; -+ if (qh->mux == 1) { -+ if (usb_pipein(urb->pipe)) -+ sched = &musb->in_bulk; -+ else -+ sched = &musb->out_bulk; -+ break; -+ } - default: - /* REVISIT when we get a schedule tree, periodic - * transfers won't always be at the head of a -@@ -2131,11 +2143,13 @@ - sched = &musb->control; - break; - case USB_ENDPOINT_XFER_BULK: -- if (is_in) -- sched = &musb->in_bulk; -- else -- sched = &musb->out_bulk; -- break; -+ if (qh->mux == 1) { -+ if (is_in) -+ sched = &musb->in_bulk; -+ else -+ sched = &musb->out_bulk; -+ break; -+ } - case USB_ENDPOINT_XFER_ISOC: - case USB_ENDPOINT_XFER_INT: - for (i = 0; i < musb->nr_endpoints; i++) { ---- /tmp/musb_host.h 2008-10-07 08:59:38.000000000 +0200 -+++ git/drivers/usb/musb/musb_host.h 2008-10-07 10:10:54.000000000 +0200 -@@ -53,7 +53,8 @@ - - struct list_head ring; /* of musb_qh */ - /* struct musb_qh *next; */ /* for periodic tree */ -- -+ u8 mux; /* qh multiplexed to hw_ep */ -+ - unsigned offset; /* in urb->transfer_buffer */ - unsigned segsize; /* current xfer fragment */ - diff --git a/packages/linux/linux-omap/musb-fix-multiple-bulk-transfers.diff b/packages/linux/linux-omap/musb-fix-multiple-bulk-transfers.diff deleted file mode 100644 index 7435a2e413..0000000000 --- a/packages/linux/linux-omap/musb-fix-multiple-bulk-transfers.diff +++ /dev/null @@ -1,194 +0,0 @@ -From: Ajay Kumar Gupta <ajay.gupta@ti.com> -To: linux-usb@vger.kernel.org -Cc: linux-omap@vger.kernel.org, felipe.balbi@nokia.com, -Subject: [PATCH] MUSB: Fix for kernel panic with multiple bulk transfer -Date: Wed, 1 Oct 2008 13:08:56 +0530 - -Fixes kernel panic when multiple copy is performed among more than two mass -storage media and transfer is aborted.musb_advance_schedule(), -musb_urb_dequeue(),musb_cleanup_urb() and musb_h_disable() functions have -been modified to correct urb handling associated with bulk and control -endpoints which are multiplexed on one hardware endpoint. - -musb_advance_schedule() has been removed from musb_cleanup_urb() and added -to musb_urb_dequeue(). musb_h_disable() has been modified to take care of -multiple qh on same hw_ep scenario. - -Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> -CC: Romit Dasgupta <romit@ti.com> ---- -Suggestions welcome to move while loop doing kfree(qh) from -musb_advance_schedule() and musb_h_disable() to musb_giveback(). - - drivers/usb/musb/musb_host.c | 105 ++++++++++++++++++++++++++++++----------- - 1 files changed, 77 insertions(+), 28 deletions(-) - -diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c -index 8b4be01..c2474de 100644 ---- a/drivers/usb/musb/musb_host.c -+++ b/drivers/usb/musb/musb_host.c -@@ -427,8 +427,17 @@ musb_advance_schedule(struct musb *musb, struct urb *urb, - qh = musb_giveback(qh, urb, 0); - else - qh = musb_giveback(qh, urb, urb->status); -+ while (qh && qh->is_ready && list_empty(&qh->hep->urb_list)) { -+ struct list_head *head; -+ head = qh->ring.prev; -+ list_del(&qh->ring); -+ qh->hep->hcpriv = NULL; -+ kfree(qh); -+ qh = first_qh(head); -+ } - -- if (qh && qh->is_ready && !list_empty(&qh->hep->urb_list)) { -+ -+ if (qh && qh->is_ready) { - DBG(4, "... next ep%d %cX urb %p\n", - hw_ep->epnum, is_in ? 'R' : 'T', - next_urb(qh)); -@@ -1964,8 +1973,6 @@ static int musb_cleanup_urb(struct urb *urb, struct musb_qh *qh, int is_in) - /* flush cpu writebuffer */ - csr = musb_readw(epio, MUSB_TXCSR); - } -- if (status == 0) -- musb_advance_schedule(ep->musb, urb, ep, is_in); - return status; - } - -@@ -2026,13 +2033,24 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) - /* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */ - if (ret < 0 || (sched && qh != first_qh(sched))) { - int ready = qh->is_ready; -- -+ int type = urb->pipe; - ret = 0; - qh->is_ready = 0; - __musb_giveback(musb, urb, 0); -- qh->is_ready = ready; -- } else -+ -+ if (list_empty(&qh->hep->urb_list) && list_empty(&qh->ring)) -+ list_del(&qh->ring); -+ else -+ qh->is_ready = ready; -+ if (usb_pipeisoc(type)) -+ musb->periodic[qh->hw_ep->epnum] = NULL; -+ } else { - ret = musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN); -+ if (!ret) { -+ musb_advance_schedule(qh->hw_ep->musb, urb, qh->hw_ep, -+ urb->pipe & USB_DIR_IN); -+ } -+ } - done: - spin_unlock_irqrestore(&musb->lock, flags); - return ret; -@@ -2046,14 +2064,17 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) - unsigned long flags; - struct musb *musb = hcd_to_musb(hcd); - u8 is_in = epnum & USB_DIR_IN; -- struct musb_qh *qh = hep->hcpriv; -+ struct musb_qh *qh, *qh_for_curr_urb; - struct urb *urb, *tmp; - struct list_head *sched; -- -- if (!qh) -- return; -+ int i; - - spin_lock_irqsave(&musb->lock, flags); -+ qh = hep->hcpriv; -+ if (!qh) { -+ spin_unlock_irqrestore(&musb->lock, flags); -+ return; -+ } - - switch (qh->type) { - case USB_ENDPOINT_XFER_CONTROL: -@@ -2065,6 +2086,13 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) - else - sched = &musb->out_bulk; - break; -+ case USB_ENDPOINT_XFER_ISOC: -+ case USB_ENDPOINT_XFER_INT: -+ for (i = 0; i < musb->nr_endpoints; i++) { -+ if (musb->periodic[i] == qh) -+ sched = &qh->ring; -+ break; -+ } - default: - /* REVISIT when we get a schedule tree, periodic transfers - * won't always be at the head of a singleton queue... -@@ -2073,26 +2101,47 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep) - break; - } - -- /* NOTE: qh is invalid unless !list_empty(&hep->urb_list) */ -- - /* kick first urb off the hardware, if needed */ -- qh->is_ready = 0; -- if (!sched || qh == first_qh(sched)) { -+ if (sched) { -+ qh_for_curr_urb = qh; - urb = next_urb(qh); -- -- /* make software (then hardware) stop ASAP */ -- if (!urb->unlinked) -- urb->status = -ESHUTDOWN; -- -- /* cleanup */ -- musb_cleanup_urb(urb, qh, urb->pipe & USB_DIR_IN); -- } else -- urb = NULL; -- -- /* then just nuke all the others */ -- list_for_each_entry_safe_from(urb, tmp, &hep->urb_list, urb_list) -- musb_giveback(qh, urb, -ESHUTDOWN); -- -+ if (urb) { -+ /* make software (then hardware) stop ASAP */ -+ if (!urb->unlinked) -+ urb->status = -ESHUTDOWN; -+ /* cleanup first urb of first qh; */ -+ if (qh == first_qh(sched)) { -+ musb_cleanup_urb(urb, qh, -+ urb->pipe & USB_DIR_IN); -+ } -+ qh = musb_giveback(qh, urb, -ESHUTDOWN); -+ if (qh == qh_for_curr_urb) { -+ list_for_each_entry_safe_from(urb, tmp, -+ &hep->urb_list, urb_list) { -+ qh = musb_giveback(qh, tmp, -ESHUTDOWN); -+ if (qh != qh_for_curr_urb) -+ break; -+ } -+ } -+ } -+ /* pick the next candidate and go */ -+ if (qh && qh->is_ready) { -+ while (qh && qh->is_ready && -+ list_empty(&qh->hep->urb_list)) { -+ struct list_head *head; -+ head = qh->ring.prev; -+ list_del(&qh->ring); -+ qh->hep->hcpriv = NULL; -+ kfree(qh); -+ qh = first_qh(head); -+ } -+ if (qh && qh->is_ready) { -+ epnum = qh->hep->desc.bEndpointAddress; -+ is_in = epnum & USB_DIR_IN; -+ musb_start_urb(musb, is_in, qh); -+ } -+ } -+ } - spin_unlock_irqrestore(&musb->lock, flags); - } - --- -1.5.6 - --- -To unsubscribe from this list: send the line "unsubscribe linux-omap" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html |