diff options
| -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 | ||
