diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-06-09 16:09:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-06-09 16:09:07 -0400 |
commit | 461df4ded3a143f09f9d0e870e7b16b787dc0591 (patch) | |
tree | eb8d7ce054832d5da0666bcab2ae1f651c72112e | |
parent | 361932bf84657b5dc0779046c751f06998c0d81f (diff) | |
parent | 8aa460e9e9f6eb6c23c8b244516bedddee901ceb (diff) |
Merge branch 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6
* 'staging-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6:
staging: iio: max517: Fix iio_info changes
Staging: mei: fix debug code
Staging: cx23885: fix include of altera.h
staging: iio: error case memory leak fix
staging: ath6kl: Fix a kernel panic during suspend/resume
staging: gma500: get control from firmware framebuffer if conflicts
staging: gma500: Skip bogus LVDS VBT mode and check for LVDS before adding backlight
staging: usbip: bugfix prevent driver unbind
staging: iio: industrialio-trigger: set iio_poll_func private_data
staging: rts_pstor: use bitwise operator instead of logical one
staging: fix ath6kl build when CFG80211 is not enabled
staging: brcm80211: fix for 'multiple definition of wl_msg_level' build err
staging: fix olpc_dcon build, needs BACKLIGHT_CLASS_DEVICE
Staging: remove STAGING_EXCLUDE_BUILD option
Staging: altera: move .h file to proper place
-rw-r--r-- | drivers/media/video/cx23885/cx23885-cards.c | 2 | ||||
-rw-r--r-- | drivers/staging/Kconfig | 18 | ||||
-rw-r--r-- | drivers/staging/altera-stapl/altera-jtag.c | 2 | ||||
-rw-r--r-- | drivers/staging/altera-stapl/altera.c | 2 | ||||
-rw-r--r-- | drivers/staging/altera-stapl/altera.h (renamed from include/staging/altera.h) | 0 | ||||
-rw-r--r-- | drivers/staging/ath6kl/Kconfig | 1 | ||||
-rw-r--r-- | drivers/staging/ath6kl/os/linux/cfg80211.c | 3 | ||||
-rw-r--r-- | drivers/staging/brcm80211/brcmfmac/wl_iw.c | 2 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_drv.c | 15 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_fb.c | 10 | ||||
-rw-r--r-- | drivers/staging/gma500/psb_intel_bios.c | 13 | ||||
-rw-r--r-- | drivers/staging/iio/dac/max517.c | 2 | ||||
-rw-r--r-- | drivers/staging/iio/imu/adis16400_ring.c | 10 | ||||
-rw-r--r-- | drivers/staging/iio/industrialio-trigger.c | 1 | ||||
-rw-r--r-- | drivers/staging/mei/init.c | 4 | ||||
-rw-r--r-- | drivers/staging/olpc_dcon/Kconfig | 1 | ||||
-rw-r--r-- | drivers/staging/rts_pstor/sd.c | 2 | ||||
-rw-r--r-- | drivers/staging/usbip/stub_dev.c | 21 | ||||
-rw-r--r-- | drivers/staging/usbip/stub_rx.c | 20 |
19 files changed, 84 insertions, 45 deletions
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index 2354336862cf..934185cca758 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c | |||
@@ -25,8 +25,8 @@ | |||
25 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
26 | #include <media/cx25840.h> | 26 | #include <media/cx25840.h> |
27 | #include <linux/firmware.h> | 27 | #include <linux/firmware.h> |
28 | #include <staging/altera.h> | ||
29 | 28 | ||
29 | #include "../../../staging/altera-stapl/altera.h" | ||
30 | #include "cx23885.h" | 30 | #include "cx23885.h" |
31 | #include "tuner-xc2028.h" | 31 | #include "tuner-xc2028.h" |
32 | #include "netup-init.h" | 32 | #include "netup-init.h" |
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index dfc16f955eb8..196284dc2f36 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig | |||
@@ -24,23 +24,6 @@ menuconfig STAGING | |||
24 | 24 | ||
25 | if STAGING | 25 | if STAGING |
26 | 26 | ||
27 | config STAGING_EXCLUDE_BUILD | ||
28 | bool "Exclude Staging drivers from being built" if STAGING | ||
29 | default y | ||
30 | ---help--- | ||
31 | Are you sure you really want to build the staging drivers? | ||
32 | They taint your kernel, don't live up to the normal Linux | ||
33 | kernel quality standards, are a bit crufty around the edges, | ||
34 | and might go off and kick your dog when you aren't paying | ||
35 | attention. | ||
36 | |||
37 | Say N here to be able to select and build the Staging drivers. | ||
38 | This option is primarily here to prevent them from being built | ||
39 | when selecting 'make allyesconfg' and 'make allmodconfig' so | ||
40 | don't be all that put off, your dog will be just fine. | ||
41 | |||
42 | if !STAGING_EXCLUDE_BUILD | ||
43 | |||
44 | source "drivers/staging/tty/Kconfig" | 27 | source "drivers/staging/tty/Kconfig" |
45 | 28 | ||
46 | source "drivers/staging/generic_serial/Kconfig" | 29 | source "drivers/staging/generic_serial/Kconfig" |
@@ -177,5 +160,4 @@ source "drivers/staging/mei/Kconfig" | |||
177 | 160 | ||
178 | source "drivers/staging/nvec/Kconfig" | 161 | source "drivers/staging/nvec/Kconfig" |
179 | 162 | ||
180 | endif # !STAGING_EXCLUDE_BUILD | ||
181 | endif # STAGING | 163 | endif # STAGING |
diff --git a/drivers/staging/altera-stapl/altera-jtag.c b/drivers/staging/altera-stapl/altera-jtag.c index 876308858b82..8b1620b1b2d0 100644 --- a/drivers/staging/altera-stapl/altera-jtag.c +++ b/drivers/staging/altera-stapl/altera-jtag.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/delay.h> | 26 | #include <linux/delay.h> |
27 | #include <linux/firmware.h> | 27 | #include <linux/firmware.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <staging/altera.h> | 29 | #include "altera.h" |
30 | #include "altera-exprt.h" | 30 | #include "altera-exprt.h" |
31 | #include "altera-jtag.h" | 31 | #include "altera-jtag.h" |
32 | 32 | ||
diff --git a/drivers/staging/altera-stapl/altera.c b/drivers/staging/altera-stapl/altera.c index 05aad351b120..9cd5e76880c0 100644 --- a/drivers/staging/altera-stapl/altera.c +++ b/drivers/staging/altera-stapl/altera.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <linux/string.h> | 28 | #include <linux/string.h> |
29 | #include <linux/firmware.h> | 29 | #include <linux/firmware.h> |
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <staging/altera.h> | 31 | #include "altera.h" |
32 | #include "altera-exprt.h" | 32 | #include "altera-exprt.h" |
33 | #include "altera-jtag.h" | 33 | #include "altera-jtag.h" |
34 | 34 | ||
diff --git a/include/staging/altera.h b/drivers/staging/altera-stapl/altera.h index 94c0c6181daf..94c0c6181daf 100644 --- a/include/staging/altera.h +++ b/drivers/staging/altera-stapl/altera.h | |||
diff --git a/drivers/staging/ath6kl/Kconfig b/drivers/staging/ath6kl/Kconfig index 1f15e1fb1ab2..afd6cc16a2b8 100644 --- a/drivers/staging/ath6kl/Kconfig +++ b/drivers/staging/ath6kl/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config ATH6K_LEGACY | 1 | config ATH6K_LEGACY |
2 | tristate "Atheros AR6003 support (non mac80211)" | 2 | tristate "Atheros AR6003 support (non mac80211)" |
3 | depends on MMC && WLAN | 3 | depends on MMC && WLAN |
4 | depends on CFG80211 | ||
4 | select WIRELESS_EXT | 5 | select WIRELESS_EXT |
5 | select WEXT_PRIV | 6 | select WEXT_PRIV |
6 | help | 7 | help |
diff --git a/drivers/staging/ath6kl/os/linux/cfg80211.c b/drivers/staging/ath6kl/os/linux/cfg80211.c index 77dfb4070c1d..d3a774dbb7e8 100644 --- a/drivers/staging/ath6kl/os/linux/cfg80211.c +++ b/drivers/staging/ath6kl/os/linux/cfg80211.c | |||
@@ -870,7 +870,8 @@ ar6k_cfg80211_scanComplete_event(struct ar6_softc *ar, int status) | |||
870 | if(ar->scan_request) | 870 | if(ar->scan_request) |
871 | { | 871 | { |
872 | /* Translate data to cfg80211 mgmt format */ | 872 | /* Translate data to cfg80211 mgmt format */ |
873 | wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); | 873 | if (ar->arWmi) |
874 | wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy); | ||
874 | 875 | ||
875 | cfg80211_scan_done(ar->scan_request, | 876 | cfg80211_scan_done(ar->scan_request, |
876 | ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false); | 877 | ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false); |
diff --git a/drivers/staging/brcm80211/brcmfmac/wl_iw.c b/drivers/staging/brcm80211/brcmfmac/wl_iw.c index 929ceaf363be..15e1b05ca92d 100644 --- a/drivers/staging/brcm80211/brcmfmac/wl_iw.c +++ b/drivers/staging/brcm80211/brcmfmac/wl_iw.c | |||
@@ -64,8 +64,6 @@ wl_iw_extra_params_t g_wl_iw_params; | |||
64 | extern bool wl_iw_conn_status_str(u32 event_type, u32 status, | 64 | extern bool wl_iw_conn_status_str(u32 event_type, u32 status, |
65 | u32 reason, char *stringBuf, uint buflen); | 65 | u32 reason, char *stringBuf, uint buflen); |
66 | 66 | ||
67 | uint wl_msg_level = WL_ERROR_VAL; | ||
68 | |||
69 | #define MAX_WLIW_IOCTL_LEN 1024 | 67 | #define MAX_WLIW_IOCTL_LEN 1024 |
70 | 68 | ||
71 | #ifdef CONFIG_WIRELESS_EXT | 69 | #ifdef CONFIG_WIRELESS_EXT |
diff --git a/drivers/staging/gma500/psb_drv.c b/drivers/staging/gma500/psb_drv.c index 1c45c11a774e..aa87b1b6a44a 100644 --- a/drivers/staging/gma500/psb_drv.c +++ b/drivers/staging/gma500/psb_drv.c | |||
@@ -542,6 +542,8 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) | |||
542 | unsigned long irqflags; | 542 | unsigned long irqflags; |
543 | int ret = -ENOMEM; | 543 | int ret = -ENOMEM; |
544 | uint32_t tt_pages; | 544 | uint32_t tt_pages; |
545 | struct drm_connector *connector; | ||
546 | struct psb_intel_output *psb_intel_output; | ||
545 | 547 | ||
546 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); | 548 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); |
547 | if (dev_priv == NULL) | 549 | if (dev_priv == NULL) |
@@ -663,7 +665,18 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset) | |||
663 | drm_kms_helper_poll_init(dev); | 665 | drm_kms_helper_poll_init(dev); |
664 | } | 666 | } |
665 | 667 | ||
666 | ret = psb_backlight_init(dev); | 668 | /* Only add backlight support if we have LVDS output */ |
669 | list_for_each_entry(connector, &dev->mode_config.connector_list, | ||
670 | head) { | ||
671 | psb_intel_output = to_psb_intel_output(connector); | ||
672 | |||
673 | switch (psb_intel_output->type) { | ||
674 | case INTEL_OUTPUT_LVDS: | ||
675 | ret = psb_backlight_init(dev); | ||
676 | break; | ||
677 | } | ||
678 | } | ||
679 | |||
667 | if (ret) | 680 | if (ret) |
668 | return ret; | 681 | return ret; |
669 | #if 0 | 682 | #if 0 |
diff --git a/drivers/staging/gma500/psb_fb.c b/drivers/staging/gma500/psb_fb.c index 99c03a2e06bd..084c36bbfe86 100644 --- a/drivers/staging/gma500/psb_fb.c +++ b/drivers/staging/gma500/psb_fb.c | |||
@@ -441,6 +441,16 @@ static int psbfb_create(struct psb_fbdev *fbdev, | |||
441 | info->screen_size = size; | 441 | info->screen_size = size; |
442 | memset(info->screen_base, 0, size); | 442 | memset(info->screen_base, 0, size); |
443 | 443 | ||
444 | if (dev_priv->pg->stolen_size) { | ||
445 | info->apertures = alloc_apertures(1); | ||
446 | if (!info->apertures) { | ||
447 | ret = -ENOMEM; | ||
448 | goto out_err0; | ||
449 | } | ||
450 | info->apertures->ranges[0].base = dev->mode_config.fb_base; | ||
451 | info->apertures->ranges[0].size = dev_priv->pg->stolen_size; | ||
452 | } | ||
453 | |||
444 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); | 454 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
445 | drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, | 455 | drm_fb_helper_fill_var(info, &fbdev->psb_fb_helper, |
446 | sizes->fb_width, sizes->fb_height); | 456 | sizes->fb_width, sizes->fb_height); |
diff --git a/drivers/staging/gma500/psb_intel_bios.c b/drivers/staging/gma500/psb_intel_bios.c index 48ac8ba7f40b..417965da5e24 100644 --- a/drivers/staging/gma500/psb_intel_bios.c +++ b/drivers/staging/gma500/psb_intel_bios.c | |||
@@ -154,10 +154,15 @@ static void parse_lfp_panel_data(struct drm_psb_private *dev_priv, | |||
154 | 154 | ||
155 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); | 155 | fill_detail_timing_data(panel_fixed_mode, dvo_timing); |
156 | 156 | ||
157 | dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; | 157 | if (panel_fixed_mode->htotal > 0 && panel_fixed_mode->vtotal > 0) { |
158 | 158 | dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; | |
159 | DRM_DEBUG("Found panel mode in BIOS VBT tables:\n"); | 159 | DRM_DEBUG("Found panel mode in BIOS VBT tables:\n"); |
160 | drm_mode_debug_printmodeline(panel_fixed_mode); | 160 | drm_mode_debug_printmodeline(panel_fixed_mode); |
161 | } else { | ||
162 | DRM_DEBUG("Ignoring bogus LVDS VBT mode.\n"); | ||
163 | dev_priv->lvds_vbt = 0; | ||
164 | kfree(panel_fixed_mode); | ||
165 | } | ||
161 | 166 | ||
162 | return; | 167 | return; |
163 | } | 168 | } |
diff --git a/drivers/staging/iio/dac/max517.c b/drivers/staging/iio/dac/max517.c index 881768df47a6..2fe34d21b6aa 100644 --- a/drivers/staging/iio/dac/max517.c +++ b/drivers/staging/iio/dac/max517.c | |||
@@ -195,7 +195,7 @@ static const struct iio_info max517_info = { | |||
195 | }; | 195 | }; |
196 | 196 | ||
197 | static const struct iio_info max518_info = { | 197 | static const struct iio_info max518_info = { |
198 | .attrs = &max517_attribute_group, | 198 | .attrs = &max518_attribute_group, |
199 | .driver_module = THIS_MODULE, | 199 | .driver_module = THIS_MODULE, |
200 | }; | 200 | }; |
201 | 201 | ||
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c index 2589a7e167e4..3612373ddede 100644 --- a/drivers/staging/iio/imu/adis16400_ring.c +++ b/drivers/staging/iio/imu/adis16400_ring.c | |||
@@ -137,13 +137,13 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
137 | if (st->variant->flags & ADIS16400_NO_BURST) { | 137 | if (st->variant->flags & ADIS16400_NO_BURST) { |
138 | ret = adis16350_spi_read_all(&indio_dev->dev, st->rx); | 138 | ret = adis16350_spi_read_all(&indio_dev->dev, st->rx); |
139 | if (ret < 0) | 139 | if (ret < 0) |
140 | return ret; | 140 | goto err; |
141 | for (; i < ring->scan_count; i++) | 141 | for (; i < ring->scan_count; i++) |
142 | data[i] = *(s16 *)(st->rx + i*2); | 142 | data[i] = *(s16 *)(st->rx + i*2); |
143 | } else { | 143 | } else { |
144 | ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx); | 144 | ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx); |
145 | if (ret < 0) | 145 | if (ret < 0) |
146 | return ret; | 146 | goto err; |
147 | for (; i < indio_dev->ring->scan_count; i++) { | 147 | for (; i < indio_dev->ring->scan_count; i++) { |
148 | j = __ffs(mask); | 148 | j = __ffs(mask); |
149 | mask &= ~(1 << j); | 149 | mask &= ~(1 << j); |
@@ -158,9 +158,13 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p) | |||
158 | ring->access->store_to(indio_dev->ring, (u8 *) data, pf->timestamp); | 158 | ring->access->store_to(indio_dev->ring, (u8 *) data, pf->timestamp); |
159 | 159 | ||
160 | iio_trigger_notify_done(indio_dev->trig); | 160 | iio_trigger_notify_done(indio_dev->trig); |
161 | kfree(data); | ||
162 | 161 | ||
162 | kfree(data); | ||
163 | return IRQ_HANDLED; | 163 | return IRQ_HANDLED; |
164 | |||
165 | err: | ||
166 | kfree(data); | ||
167 | return ret; | ||
164 | } | 168 | } |
165 | 169 | ||
166 | void adis16400_unconfigure_ring(struct iio_dev *indio_dev) | 170 | void adis16400_unconfigure_ring(struct iio_dev *indio_dev) |
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c index 615902333fb0..d504aa251ced 100644 --- a/drivers/staging/iio/industrialio-trigger.c +++ b/drivers/staging/iio/industrialio-trigger.c | |||
@@ -294,6 +294,7 @@ struct iio_poll_func | |||
294 | pf->h = h; | 294 | pf->h = h; |
295 | pf->thread = thread; | 295 | pf->thread = thread; |
296 | pf->type = type; | 296 | pf->type = type; |
297 | pf->private_data = private; | ||
297 | 298 | ||
298 | return pf; | 299 | return pf; |
299 | } | 300 | } |
diff --git a/drivers/staging/mei/init.c b/drivers/staging/mei/init.c index 2818851c0761..d1ffa32cd141 100644 --- a/drivers/staging/mei/init.c +++ b/drivers/staging/mei/init.c | |||
@@ -205,10 +205,10 @@ int mei_hw_init(struct mei_device *dev) | |||
205 | "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n", | 205 | "host_hw_state = 0x%08x, me_hw_state = 0x%08x.\n", |
206 | dev->host_hw_state, dev->me_hw_state); | 206 | dev->host_hw_state, dev->me_hw_state); |
207 | 207 | ||
208 | if (!(dev->host_hw_state & H_RDY) != H_RDY) | 208 | if (!(dev->host_hw_state & H_RDY)) |
209 | dev_dbg(&dev->pdev->dev, "host turn off H_RDY.\n"); | 209 | dev_dbg(&dev->pdev->dev, "host turn off H_RDY.\n"); |
210 | 210 | ||
211 | if (!(dev->me_hw_state & ME_RDY_HRA) != ME_RDY_HRA) | 211 | if (!(dev->me_hw_state & ME_RDY_HRA)) |
212 | dev_dbg(&dev->pdev->dev, "ME turn off ME_RDY.\n"); | 212 | dev_dbg(&dev->pdev->dev, "ME turn off ME_RDY.\n"); |
213 | 213 | ||
214 | printk(KERN_ERR "mei: link layer initialization failed.\n"); | 214 | printk(KERN_ERR "mei: link layer initialization failed.\n"); |
diff --git a/drivers/staging/olpc_dcon/Kconfig b/drivers/staging/olpc_dcon/Kconfig index b05306766870..fe40e0b6f675 100644 --- a/drivers/staging/olpc_dcon/Kconfig +++ b/drivers/staging/olpc_dcon/Kconfig | |||
@@ -2,6 +2,7 @@ config FB_OLPC_DCON | |||
2 | tristate "One Laptop Per Child Display CONtroller support" | 2 | tristate "One Laptop Per Child Display CONtroller support" |
3 | depends on OLPC && FB | 3 | depends on OLPC && FB |
4 | select I2C | 4 | select I2C |
5 | select BACKLIGHT_CLASS_DEVICE | ||
5 | ---help--- | 6 | ---help--- |
6 | Add support for the OLPC XO DCON controller. This controller is | 7 | Add support for the OLPC XO DCON controller. This controller is |
7 | only available on OLPC platforms. Unless you have one of these | 8 | only available on OLPC platforms. Unless you have one of these |
diff --git a/drivers/staging/rts_pstor/sd.c b/drivers/staging/rts_pstor/sd.c index bddb0312b31e..cdae497d5467 100644 --- a/drivers/staging/rts_pstor/sd.c +++ b/drivers/staging/rts_pstor/sd.c | |||
@@ -2328,7 +2328,7 @@ Switch_Fail: | |||
2328 | 2328 | ||
2329 | retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0, SD_RSP_TYPE_R4, rsp, 5); | 2329 | retval = sd_send_cmd_get_rsp(chip, IO_SEND_OP_COND, 0, SD_RSP_TYPE_R4, rsp, 5); |
2330 | if (retval == STATUS_SUCCESS) { | 2330 | if (retval == STATUS_SUCCESS) { |
2331 | int func_num = (rsp[1] >> 4) && 0x07; | 2331 | int func_num = (rsp[1] >> 4) & 0x07; |
2332 | if (func_num) { | 2332 | if (func_num) { |
2333 | RTSX_DEBUGP("SD_IO card (Function number: %d)!\n", func_num); | 2333 | RTSX_DEBUGP("SD_IO card (Function number: %d)!\n", func_num); |
2334 | chip->sd_io = 1; | 2334 | chip->sd_io = 1; |
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index 6e99ec87fee0..8cbea42b69bc 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c | |||
@@ -26,6 +26,8 @@ | |||
26 | static int stub_probe(struct usb_interface *interface, | 26 | static int stub_probe(struct usb_interface *interface, |
27 | const struct usb_device_id *id); | 27 | const struct usb_device_id *id); |
28 | static void stub_disconnect(struct usb_interface *interface); | 28 | static void stub_disconnect(struct usb_interface *interface); |
29 | static int stub_pre_reset(struct usb_interface *interface); | ||
30 | static int stub_post_reset(struct usb_interface *interface); | ||
29 | 31 | ||
30 | /* | 32 | /* |
31 | * Define device IDs here if you want to explicitly limit exportable devices. | 33 | * Define device IDs here if you want to explicitly limit exportable devices. |
@@ -59,6 +61,8 @@ struct usb_driver stub_driver = { | |||
59 | .probe = stub_probe, | 61 | .probe = stub_probe, |
60 | .disconnect = stub_disconnect, | 62 | .disconnect = stub_disconnect, |
61 | .id_table = stub_table, | 63 | .id_table = stub_table, |
64 | .pre_reset = stub_pre_reset, | ||
65 | .post_reset = stub_post_reset, | ||
62 | }; | 66 | }; |
63 | 67 | ||
64 | /* | 68 | /* |
@@ -541,3 +545,20 @@ static void stub_disconnect(struct usb_interface *interface) | |||
541 | del_match_busid((char *)udev_busid); | 545 | del_match_busid((char *)udev_busid); |
542 | } | 546 | } |
543 | } | 547 | } |
548 | |||
549 | /* | ||
550 | * Presence of pre_reset and post_reset prevents the driver from being unbound | ||
551 | * when the device is being reset | ||
552 | */ | ||
553 | |||
554 | int stub_pre_reset(struct usb_interface *interface) | ||
555 | { | ||
556 | dev_dbg(&interface->dev, "pre_reset\n"); | ||
557 | return 0; | ||
558 | } | ||
559 | |||
560 | int stub_post_reset(struct usb_interface *interface) | ||
561 | { | ||
562 | dev_dbg(&interface->dev, "post_reset\n"); | ||
563 | return 0; | ||
564 | } | ||
diff --git a/drivers/staging/usbip/stub_rx.c b/drivers/staging/usbip/stub_rx.c index a5c1fa1f0430..bc57844600b9 100644 --- a/drivers/staging/usbip/stub_rx.c +++ b/drivers/staging/usbip/stub_rx.c | |||
@@ -175,16 +175,18 @@ static int tweak_reset_device_cmd(struct urb *urb) | |||
175 | dev_info(&urb->dev->dev, "usb_queue_reset_device\n"); | 175 | dev_info(&urb->dev->dev, "usb_queue_reset_device\n"); |
176 | 176 | ||
177 | /* | 177 | /* |
178 | * usb_lock_device_for_reset caused a deadlock: it causes the driver | 178 | * With the implementation of pre_reset and post_reset the driver no |
179 | * to unbind. In the shutdown the rx thread is signalled to shut down | 179 | * longer unbinds. This allows the use of synchronous reset. |
180 | * but this thread is pending in the usb_lock_device_for_reset. | ||
181 | * | ||
182 | * Instead queue the reset. | ||
183 | * | ||
184 | * Unfortunatly an existing usbip connection will be dropped due to | ||
185 | * driver unbinding. | ||
186 | */ | 180 | */ |
187 | usb_queue_reset_device(sdev->interface); | 181 | |
182 | if (usb_lock_device_for_reset(sdev->udev, sdev->interface)<0) | ||
183 | { | ||
184 | dev_err(&urb->dev->dev, "could not obtain lock to reset device\n"); | ||
185 | return 0; | ||
186 | } | ||
187 | usb_reset_device(sdev->udev); | ||
188 | usb_unlock_device(sdev->udev); | ||
189 | |||
188 | return 0; | 190 | return 0; |
189 | } | 191 | } |
190 | 192 | ||