diff options
author | Olof Johansson <olof@lixom.net> | 2014-09-24 14:20:48 -0400 |
---|---|---|
committer | Olof Johansson <olof@lixom.net> | 2014-09-24 14:21:01 -0400 |
commit | 28fd837204236cf5b5533525e5b53c5176fa97a3 (patch) | |
tree | ac7dcad925950bc0bb53c5a55cb199e31e7aaee0 /drivers | |
parent | c82eb464879dd0ecbe0c4cb1b80ac4e82b634872 (diff) | |
parent | 64d14a31d5410ea34641c41795e0ba222bda740c (diff) |
Merge tag 'imx-cleanup-3.18' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux into next/cleanup
Merge "ARM: imx: cleanup for 3.18" from Shawn Guo:
The i.MX cleanup for 3.18:
- Reomve a few i.MX27 and i.MX1 board files
- Remove imx_scu_standby_enable() since core code handles scu
standby now
- Remove unnecessary iomux declaration
- Remove useless sound card property from vf610-twr dts
* tag 'imx-cleanup-3.18' of git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux:
ARM: imx: Remove mach-mxt_td60 board file
ARM: i.MX: Remove i.MX1 ADS board support
ARM: dts: vf610-twr: remove useless property for sound card.
ARM: imx: remove imx_scu_standby_enable()
ARM: i.MX: Remove Phytec i.MX27 PCM038/PCM970 board files
ARM: i.MX: Remove mach-cpuimx27sd board file
ARM: imx: iomux: Do not export symbol without public declaration
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers')
168 files changed, 760 insertions, 6123 deletions
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index ce06149088c5..9dfec48dd4e5 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
@@ -196,6 +196,17 @@ static struct lpss_device_desc byt_i2c_dev_desc = { | |||
196 | .setup = lpss_i2c_setup, | 196 | .setup = lpss_i2c_setup, |
197 | }; | 197 | }; |
198 | 198 | ||
199 | static struct lpss_shared_clock bsw_pwm_clock = { | ||
200 | .name = "pwm_clk", | ||
201 | .rate = 19200000, | ||
202 | }; | ||
203 | |||
204 | static struct lpss_device_desc bsw_pwm_dev_desc = { | ||
205 | .clk_required = true, | ||
206 | .save_ctx = true, | ||
207 | .shared_clock = &bsw_pwm_clock, | ||
208 | }; | ||
209 | |||
199 | #else | 210 | #else |
200 | 211 | ||
201 | #define LPSS_ADDR(desc) (0UL) | 212 | #define LPSS_ADDR(desc) (0UL) |
@@ -225,6 +236,12 @@ static const struct acpi_device_id acpi_lpss_device_ids[] = { | |||
225 | { "INT33B2", }, | 236 | { "INT33B2", }, |
226 | { "INT33FC", }, | 237 | { "INT33FC", }, |
227 | 238 | ||
239 | /* Braswell LPSS devices */ | ||
240 | { "80862288", LPSS_ADDR(bsw_pwm_dev_desc) }, | ||
241 | { "8086228A", LPSS_ADDR(byt_uart_dev_desc) }, | ||
242 | { "8086228E", LPSS_ADDR(byt_spi_dev_desc) }, | ||
243 | { "808622C1", LPSS_ADDR(byt_i2c_dev_desc) }, | ||
244 | |||
228 | { "INT3430", LPSS_ADDR(lpt_dev_desc) }, | 245 | { "INT3430", LPSS_ADDR(lpt_dev_desc) }, |
229 | { "INT3431", LPSS_ADDR(lpt_dev_desc) }, | 246 | { "INT3431", LPSS_ADDR(lpt_dev_desc) }, |
230 | { "INT3432", LPSS_ADDR(lpt_i2c_dev_desc) }, | 247 | { "INT3432", LPSS_ADDR(lpt_i2c_dev_desc) }, |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index a66ab658abbc..9922cc46b15c 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -197,6 +197,8 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
197 | t->rdata[t->ri++] = acpi_ec_read_data(ec); | 197 | t->rdata[t->ri++] = acpi_ec_read_data(ec); |
198 | if (t->rlen == t->ri) { | 198 | if (t->rlen == t->ri) { |
199 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 199 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
200 | if (t->command == ACPI_EC_COMMAND_QUERY) | ||
201 | pr_debug("hardware QR_EC completion\n"); | ||
200 | wakeup = true; | 202 | wakeup = true; |
201 | } | 203 | } |
202 | } else | 204 | } else |
@@ -208,7 +210,20 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
208 | } | 210 | } |
209 | return wakeup; | 211 | return wakeup; |
210 | } else { | 212 | } else { |
211 | if ((status & ACPI_EC_FLAG_IBF) == 0) { | 213 | /* |
214 | * There is firmware refusing to respond QR_EC when SCI_EVT | ||
215 | * is not set, for which case, we complete the QR_EC | ||
216 | * without issuing it to the firmware. | ||
217 | * https://bugzilla.kernel.org/show_bug.cgi?id=86211 | ||
218 | */ | ||
219 | if (!(status & ACPI_EC_FLAG_SCI) && | ||
220 | (t->command == ACPI_EC_COMMAND_QUERY)) { | ||
221 | t->flags |= ACPI_EC_COMMAND_POLL; | ||
222 | t->rdata[t->ri++] = 0x00; | ||
223 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | ||
224 | pr_debug("software QR_EC completion\n"); | ||
225 | wakeup = true; | ||
226 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { | ||
212 | acpi_ec_write_cmd(ec, t->command); | 227 | acpi_ec_write_cmd(ec, t->command); |
213 | t->flags |= ACPI_EC_COMMAND_POLL; | 228 | t->flags |= ACPI_EC_COMMAND_POLL; |
214 | } else | 229 | } else |
@@ -288,11 +303,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
288 | /* following two actions should be kept atomic */ | 303 | /* following two actions should be kept atomic */ |
289 | ec->curr = t; | 304 | ec->curr = t; |
290 | start_transaction(ec); | 305 | start_transaction(ec); |
291 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) | ||
292 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | ||
293 | spin_unlock_irqrestore(&ec->lock, tmp); | 306 | spin_unlock_irqrestore(&ec->lock, tmp); |
294 | ret = ec_poll(ec); | 307 | ret = ec_poll(ec); |
295 | spin_lock_irqsave(&ec->lock, tmp); | 308 | spin_lock_irqsave(&ec->lock, tmp); |
309 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) | ||
310 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | ||
296 | ec->curr = NULL; | 311 | ec->curr = NULL; |
297 | spin_unlock_irqrestore(&ec->lock, tmp); | 312 | spin_unlock_irqrestore(&ec->lock, tmp); |
298 | return ret; | 313 | return ret; |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index c96887d5289e..6e6b80eb0bba 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -484,6 +484,10 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | |||
484 | /* Keep IOAPIC pin configuration when suspending */ | 484 | /* Keep IOAPIC pin configuration when suspending */ |
485 | if (dev->dev.power.is_prepared) | 485 | if (dev->dev.power.is_prepared) |
486 | return; | 486 | return; |
487 | #ifdef CONFIG_PM_RUNTIME | ||
488 | if (dev->dev.power.runtime_status == RPM_SUSPENDING) | ||
489 | return; | ||
490 | #endif | ||
487 | 491 | ||
488 | entry = acpi_pci_irq_lookup(dev, pin); | 492 | entry = acpi_pci_irq_lookup(dev, pin); |
489 | if (!entry) | 493 | if (!entry) |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 0a817ad24f16..9a9298994e26 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -922,12 +922,17 @@ static void acpi_device_notify(acpi_handle handle, u32 event, void *data) | |||
922 | device->driver->ops.notify(device, event); | 922 | device->driver->ops.notify(device, event); |
923 | } | 923 | } |
924 | 924 | ||
925 | static acpi_status acpi_device_notify_fixed(void *data) | 925 | static void acpi_device_notify_fixed(void *data) |
926 | { | 926 | { |
927 | struct acpi_device *device = data; | 927 | struct acpi_device *device = data; |
928 | 928 | ||
929 | /* Fixed hardware devices have no handles */ | 929 | /* Fixed hardware devices have no handles */ |
930 | acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device); | 930 | acpi_device_notify(NULL, ACPI_FIXED_HARDWARE_EVENT, device); |
931 | } | ||
932 | |||
933 | static acpi_status acpi_device_fixed_event(void *data) | ||
934 | { | ||
935 | acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_device_notify_fixed, data); | ||
931 | return AE_OK; | 936 | return AE_OK; |
932 | } | 937 | } |
933 | 938 | ||
@@ -938,12 +943,12 @@ static int acpi_device_install_notify_handler(struct acpi_device *device) | |||
938 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) | 943 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) |
939 | status = | 944 | status = |
940 | acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, | 945 | acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, |
941 | acpi_device_notify_fixed, | 946 | acpi_device_fixed_event, |
942 | device); | 947 | device); |
943 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) | 948 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) |
944 | status = | 949 | status = |
945 | acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, | 950 | acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, |
946 | acpi_device_notify_fixed, | 951 | acpi_device_fixed_event, |
947 | device); | 952 | device); |
948 | else | 953 | else |
949 | status = acpi_install_notify_handler(device->handle, | 954 | status = acpi_install_notify_handler(device->handle, |
@@ -960,10 +965,10 @@ static void acpi_device_remove_notify_handler(struct acpi_device *device) | |||
960 | { | 965 | { |
961 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) | 966 | if (device->device_type == ACPI_BUS_TYPE_POWER_BUTTON) |
962 | acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, | 967 | acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON, |
963 | acpi_device_notify_fixed); | 968 | acpi_device_fixed_event); |
964 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) | 969 | else if (device->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON) |
965 | acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, | 970 | acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON, |
966 | acpi_device_notify_fixed); | 971 | acpi_device_fixed_event); |
967 | else | 972 | else |
968 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, | 973 | acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, |
969 | acpi_device_notify); | 974 | acpi_device_notify); |
@@ -975,7 +980,7 @@ static int acpi_device_probe(struct device *dev) | |||
975 | struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); | 980 | struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver); |
976 | int ret; | 981 | int ret; |
977 | 982 | ||
978 | if (acpi_dev->handler) | 983 | if (acpi_dev->handler && !acpi_is_pnp_device(acpi_dev)) |
979 | return -EINVAL; | 984 | return -EINVAL; |
980 | 985 | ||
981 | if (!acpi_drv->ops.add) | 986 | if (!acpi_drv->ops.add) |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index c7d138eca731..3598110d2cef 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
@@ -442,12 +442,15 @@ static int rd_nr; | |||
442 | int rd_size = CONFIG_BLK_DEV_RAM_SIZE; | 442 | int rd_size = CONFIG_BLK_DEV_RAM_SIZE; |
443 | static int max_part; | 443 | static int max_part; |
444 | static int part_shift; | 444 | static int part_shift; |
445 | static int part_show = 0; | ||
445 | module_param(rd_nr, int, S_IRUGO); | 446 | module_param(rd_nr, int, S_IRUGO); |
446 | MODULE_PARM_DESC(rd_nr, "Maximum number of brd devices"); | 447 | MODULE_PARM_DESC(rd_nr, "Maximum number of brd devices"); |
447 | module_param(rd_size, int, S_IRUGO); | 448 | module_param(rd_size, int, S_IRUGO); |
448 | MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes."); | 449 | MODULE_PARM_DESC(rd_size, "Size of each RAM disk in kbytes."); |
449 | module_param(max_part, int, S_IRUGO); | 450 | module_param(max_part, int, S_IRUGO); |
450 | MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk"); | 451 | MODULE_PARM_DESC(max_part, "Maximum number of partitions per RAM disk"); |
452 | module_param(part_show, int, S_IRUGO); | ||
453 | MODULE_PARM_DESC(part_show, "Control RAM disk visibility in /proc/partitions"); | ||
451 | MODULE_LICENSE("GPL"); | 454 | MODULE_LICENSE("GPL"); |
452 | MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); | 455 | MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); |
453 | MODULE_ALIAS("rd"); | 456 | MODULE_ALIAS("rd"); |
@@ -501,7 +504,8 @@ static struct brd_device *brd_alloc(int i) | |||
501 | disk->fops = &brd_fops; | 504 | disk->fops = &brd_fops; |
502 | disk->private_data = brd; | 505 | disk->private_data = brd; |
503 | disk->queue = brd->brd_queue; | 506 | disk->queue = brd->brd_queue; |
504 | disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO; | 507 | if (!part_show) |
508 | disk->flags |= GENHD_FL_SUPPRESS_PARTITION_INFO; | ||
505 | sprintf(disk->disk_name, "ram%d", i); | 509 | sprintf(disk->disk_name, "ram%d", i); |
506 | set_capacity(disk, rd_size * 2); | 510 | set_capacity(disk, rd_size * 2); |
507 | 511 | ||
diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index ab3ea62e5dfc..c4328d9d9981 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c | |||
@@ -1203,7 +1203,6 @@ static struct platform_driver ace_platform_driver = { | |||
1203 | .probe = ace_probe, | 1203 | .probe = ace_probe, |
1204 | .remove = ace_remove, | 1204 | .remove = ace_remove, |
1205 | .driver = { | 1205 | .driver = { |
1206 | .owner = THIS_MODULE, | ||
1207 | .name = "xsysace", | 1206 | .name = "xsysace", |
1208 | .of_match_table = ace_of_match, | 1207 | .of_match_table = ace_of_match, |
1209 | }, | 1208 | }, |
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index dfa4024c448a..d00831c3d731 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
@@ -378,7 +378,6 @@ static int zram_decompress_page(struct zram *zram, char *mem, u32 index) | |||
378 | /* Should NEVER happen. Return bio error if it does. */ | 378 | /* Should NEVER happen. Return bio error if it does. */ |
379 | if (unlikely(ret)) { | 379 | if (unlikely(ret)) { |
380 | pr_err("Decompression failed! err=%d, page=%u\n", ret, index); | 380 | pr_err("Decompression failed! err=%d, page=%u\n", ret, index); |
381 | atomic64_inc(&zram->stats.failed_reads); | ||
382 | return ret; | 381 | return ret; |
383 | } | 382 | } |
384 | 383 | ||
@@ -547,8 +546,6 @@ out: | |||
547 | zcomp_strm_release(zram->comp, zstrm); | 546 | zcomp_strm_release(zram->comp, zstrm); |
548 | if (is_partial_io(bvec)) | 547 | if (is_partial_io(bvec)) |
549 | kfree(uncmem); | 548 | kfree(uncmem); |
550 | if (ret) | ||
551 | atomic64_inc(&zram->stats.failed_writes); | ||
552 | return ret; | 549 | return ret; |
553 | } | 550 | } |
554 | 551 | ||
@@ -566,6 +563,13 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, | |||
566 | ret = zram_bvec_write(zram, bvec, index, offset); | 563 | ret = zram_bvec_write(zram, bvec, index, offset); |
567 | } | 564 | } |
568 | 565 | ||
566 | if (unlikely(ret)) { | ||
567 | if (rw == READ) | ||
568 | atomic64_inc(&zram->stats.failed_reads); | ||
569 | else | ||
570 | atomic64_inc(&zram->stats.failed_writes); | ||
571 | } | ||
572 | |||
569 | return ret; | 573 | return ret; |
570 | } | 574 | } |
571 | 575 | ||
diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 5b0afde729cd..e0f725c87cc6 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h | |||
@@ -84,7 +84,7 @@ struct zram_stats { | |||
84 | atomic64_t compr_data_size; /* compressed size of pages stored */ | 84 | atomic64_t compr_data_size; /* compressed size of pages stored */ |
85 | atomic64_t num_reads; /* failed + successful */ | 85 | atomic64_t num_reads; /* failed + successful */ |
86 | atomic64_t num_writes; /* --do-- */ | 86 | atomic64_t num_writes; /* --do-- */ |
87 | atomic64_t failed_reads; /* should NEVER! happen */ | 87 | atomic64_t failed_reads; /* can happen when memory is too low */ |
88 | atomic64_t failed_writes; /* can happen when memory is too low */ | 88 | atomic64_t failed_writes; /* can happen when memory is too low */ |
89 | atomic64_t invalid_io; /* non-page-aligned I/O requests */ | 89 | atomic64_t invalid_io; /* non-page-aligned I/O requests */ |
90 | atomic64_t notify_free; /* no. of swap slot free notifications */ | 90 | atomic64_t notify_free; /* no. of swap slot free notifications */ |
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index c5eac949760d..e396ad3f8f3f 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c | |||
@@ -660,6 +660,7 @@ static const struct x86_cpu_id intel_pstate_cpu_ids[] = { | |||
660 | ICPU(0x3f, core_params), | 660 | ICPU(0x3f, core_params), |
661 | ICPU(0x45, core_params), | 661 | ICPU(0x45, core_params), |
662 | ICPU(0x46, core_params), | 662 | ICPU(0x46, core_params), |
663 | ICPU(0x4c, byt_params), | ||
663 | ICPU(0x4f, core_params), | 664 | ICPU(0x4f, core_params), |
664 | ICPU(0x56, core_params), | 665 | ICPU(0x56, core_params), |
665 | {} | 666 | {} |
@@ -688,7 +689,7 @@ static int intel_pstate_init_cpu(unsigned int cpunum) | |||
688 | 689 | ||
689 | add_timer_on(&cpu->timer, cpunum); | 690 | add_timer_on(&cpu->timer, cpunum); |
690 | 691 | ||
691 | pr_info("Intel pstate controlling: cpu %d\n", cpunum); | 692 | pr_debug("Intel pstate controlling: cpu %d\n", cpunum); |
692 | 693 | ||
693 | return 0; | 694 | return 0; |
694 | } | 695 | } |
diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c index 9a68225a757e..3f9791f07b8e 100644 --- a/drivers/cpufreq/s5pv210-cpufreq.c +++ b/drivers/cpufreq/s5pv210-cpufreq.c | |||
@@ -501,7 +501,7 @@ static int check_mem_type(void __iomem *dmc_reg) | |||
501 | return val >> 8; | 501 | return val >> 8; |
502 | } | 502 | } |
503 | 503 | ||
504 | static int __init s5pv210_cpu_init(struct cpufreq_policy *policy) | 504 | static int s5pv210_cpu_init(struct cpufreq_policy *policy) |
505 | { | 505 | { |
506 | unsigned long mem_type; | 506 | unsigned long mem_type; |
507 | int ret; | 507 | int ret; |
diff --git a/drivers/cpuidle/cpuidle-big_little.c b/drivers/cpuidle/cpuidle-big_little.c index 344d79fa3407..ef94c3b81f18 100644 --- a/drivers/cpuidle/cpuidle-big_little.c +++ b/drivers/cpuidle/cpuidle-big_little.c | |||
@@ -138,25 +138,18 @@ static int bl_enter_powerdown(struct cpuidle_device *dev, | |||
138 | return idx; | 138 | return idx; |
139 | } | 139 | } |
140 | 140 | ||
141 | static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int cpu_id) | 141 | static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int part_id) |
142 | { | 142 | { |
143 | struct cpuinfo_arm *cpu_info; | ||
144 | struct cpumask *cpumask; | 143 | struct cpumask *cpumask; |
145 | unsigned long cpuid; | ||
146 | int cpu; | 144 | int cpu; |
147 | 145 | ||
148 | cpumask = kzalloc(cpumask_size(), GFP_KERNEL); | 146 | cpumask = kzalloc(cpumask_size(), GFP_KERNEL); |
149 | if (!cpumask) | 147 | if (!cpumask) |
150 | return -ENOMEM; | 148 | return -ENOMEM; |
151 | 149 | ||
152 | for_each_possible_cpu(cpu) { | 150 | for_each_possible_cpu(cpu) |
153 | cpu_info = &per_cpu(cpu_data, cpu); | 151 | if (smp_cpuid_part(cpu) == part_id) |
154 | cpuid = is_smp() ? cpu_info->cpuid : read_cpuid_id(); | ||
155 | |||
156 | /* read cpu id part number */ | ||
157 | if ((cpuid & 0xFFF0) == cpu_id) | ||
158 | cpumask_set_cpu(cpu, cpumask); | 152 | cpumask_set_cpu(cpu, cpumask); |
159 | } | ||
160 | 153 | ||
161 | drv->cpumask = cpumask; | 154 | drv->cpumask = cpumask; |
162 | 155 | ||
diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c index 4222cb2aa96a..7bb9d65d9a2c 100644 --- a/drivers/dma-buf/fence.c +++ b/drivers/dma-buf/fence.c | |||
@@ -29,7 +29,7 @@ | |||
29 | EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on); | 29 | EXPORT_TRACEPOINT_SYMBOL(fence_annotate_wait_on); |
30 | EXPORT_TRACEPOINT_SYMBOL(fence_emit); | 30 | EXPORT_TRACEPOINT_SYMBOL(fence_emit); |
31 | 31 | ||
32 | /** | 32 | /* |
33 | * fence context counter: each execution context should have its own | 33 | * fence context counter: each execution context should have its own |
34 | * fence context, this allows checking if fences belong to the same | 34 | * fence context, this allows checking if fences belong to the same |
35 | * context or not. One device can have multiple separate contexts, | 35 | * context or not. One device can have multiple separate contexts, |
diff --git a/drivers/gpu/drm/ast/ast_tables.h b/drivers/gpu/drm/ast/ast_tables.h index 4c761dcea972..05c01ea85294 100644 --- a/drivers/gpu/drm/ast/ast_tables.h +++ b/drivers/gpu/drm/ast/ast_tables.h | |||
@@ -99,6 +99,7 @@ static struct ast_vbios_dclk_info dclk_table[] = { | |||
99 | {0x25, 0x65, 0x80}, /* 16: VCLK88.75 */ | 99 | {0x25, 0x65, 0x80}, /* 16: VCLK88.75 */ |
100 | {0x77, 0x58, 0x80}, /* 17: VCLK119 */ | 100 | {0x77, 0x58, 0x80}, /* 17: VCLK119 */ |
101 | {0x32, 0x67, 0x80}, /* 18: VCLK85_5 */ | 101 | {0x32, 0x67, 0x80}, /* 18: VCLK85_5 */ |
102 | {0x6a, 0x6d, 0x80}, /* 19: VCLK97_75 */ | ||
102 | }; | 103 | }; |
103 | 104 | ||
104 | static struct ast_vbios_stdtable vbios_stdtable[] = { | 105 | static struct ast_vbios_stdtable vbios_stdtable[] = { |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index fa2be249999c..90e773019eac 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -4696,8 +4696,9 @@ int drm_mode_create_dumb_ioctl(struct drm_device *dev, | |||
4696 | return -EINVAL; | 4696 | return -EINVAL; |
4697 | 4697 | ||
4698 | /* overflow checks for 32bit size calculations */ | 4698 | /* overflow checks for 32bit size calculations */ |
4699 | /* NOTE: DIV_ROUND_UP() can overflow */ | ||
4699 | cpp = DIV_ROUND_UP(args->bpp, 8); | 4700 | cpp = DIV_ROUND_UP(args->bpp, 8); |
4700 | if (cpp > 0xffffffffU / args->width) | 4701 | if (!cpp || cpp > 0xffffffffU / args->width) |
4701 | return -EINVAL; | 4702 | return -EINVAL; |
4702 | stride = cpp * args->width; | 4703 | stride = cpp * args->width; |
4703 | if (args->height > 0xffffffffU / stride) | 4704 | if (args->height > 0xffffffffU / stride) |
diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c index 74cebb51e8c2..c6c80ea28c35 100644 --- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | |||
@@ -397,6 +397,7 @@ static void mdp4_crtc_prepare(struct drm_crtc *crtc) | |||
397 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); | 397 | struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); |
398 | DBG("%s", mdp4_crtc->name); | 398 | DBG("%s", mdp4_crtc->name); |
399 | /* make sure we hold a ref to mdp clks while setting up mode: */ | 399 | /* make sure we hold a ref to mdp clks while setting up mode: */ |
400 | drm_crtc_vblank_get(crtc); | ||
400 | mdp4_enable(get_kms(crtc)); | 401 | mdp4_enable(get_kms(crtc)); |
401 | mdp4_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); | 402 | mdp4_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); |
402 | } | 403 | } |
@@ -407,6 +408,7 @@ static void mdp4_crtc_commit(struct drm_crtc *crtc) | |||
407 | crtc_flush(crtc); | 408 | crtc_flush(crtc); |
408 | /* drop the ref to mdp clk's that we got in prepare: */ | 409 | /* drop the ref to mdp clk's that we got in prepare: */ |
409 | mdp4_disable(get_kms(crtc)); | 410 | mdp4_disable(get_kms(crtc)); |
411 | drm_crtc_vblank_put(crtc); | ||
410 | } | 412 | } |
411 | 413 | ||
412 | static int mdp4_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, | 414 | static int mdp4_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, |
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index b447c01ad89c..26ee80db17af 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c | |||
@@ -974,12 +974,11 @@ static int msm_pdev_probe(struct platform_device *pdev) | |||
974 | 974 | ||
975 | for (i = 0; i < ARRAY_SIZE(devnames); i++) { | 975 | for (i = 0; i < ARRAY_SIZE(devnames); i++) { |
976 | struct device *dev; | 976 | struct device *dev; |
977 | int ret; | ||
978 | 977 | ||
979 | dev = bus_find_device_by_name(&platform_bus_type, | 978 | dev = bus_find_device_by_name(&platform_bus_type, |
980 | NULL, devnames[i]); | 979 | NULL, devnames[i]); |
981 | if (!dev) { | 980 | if (!dev) { |
982 | dev_info(master, "still waiting for %s\n", devnames[i]); | 981 | dev_info(&pdev->dev, "still waiting for %s\n", devnames[i]); |
983 | return -EPROBE_DEFER; | 982 | return -EPROBE_DEFER; |
984 | } | 983 | } |
985 | 984 | ||
diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index 9c5221ce391a..ab5bfd2d0ebf 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c | |||
@@ -143,7 +143,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper, | |||
143 | ret = msm_gem_get_iova_locked(fbdev->bo, 0, &paddr); | 143 | ret = msm_gem_get_iova_locked(fbdev->bo, 0, &paddr); |
144 | if (ret) { | 144 | if (ret) { |
145 | dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret); | 145 | dev_err(dev->dev, "failed to get buffer obj iova: %d\n", ret); |
146 | goto fail; | 146 | goto fail_unlock; |
147 | } | 147 | } |
148 | 148 | ||
149 | fbi = framebuffer_alloc(0, dev->dev); | 149 | fbi = framebuffer_alloc(0, dev->dev); |
diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index 099af483fdf0..7acdaa5688b7 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c | |||
@@ -27,8 +27,8 @@ struct msm_iommu { | |||
27 | static int msm_fault_handler(struct iommu_domain *iommu, struct device *dev, | 27 | static int msm_fault_handler(struct iommu_domain *iommu, struct device *dev, |
28 | unsigned long iova, int flags, void *arg) | 28 | unsigned long iova, int flags, void *arg) |
29 | { | 29 | { |
30 | DBG("*** fault: iova=%08lx, flags=%d", iova, flags); | 30 | pr_warn_ratelimited("*** fault: iova=%08lx, flags=%d\n", iova, flags); |
31 | return -ENOSYS; | 31 | return 0; |
32 | } | 32 | } |
33 | 33 | ||
34 | static int msm_iommu_attach(struct msm_mmu *mmu, const char **names, int cnt) | 34 | static int msm_iommu_attach(struct msm_mmu *mmu, const char **names, int cnt) |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 79a5a5519bd6..fa9565957f9d 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -5749,20 +5749,17 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev) | |||
5749 | WREG32(0x15D8, 0); | 5749 | WREG32(0x15D8, 0); |
5750 | WREG32(0x15DC, 0); | 5750 | WREG32(0x15DC, 0); |
5751 | 5751 | ||
5752 | /* empty context1-15 */ | 5752 | /* restore context1-15 */ |
5753 | /* FIXME start with 4G, once using 2 level pt switch to full | ||
5754 | * vm size space | ||
5755 | */ | ||
5756 | /* set vm size, must be a multiple of 4 */ | 5753 | /* set vm size, must be a multiple of 4 */ |
5757 | WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0); | 5754 | WREG32(VM_CONTEXT1_PAGE_TABLE_START_ADDR, 0); |
5758 | WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn); | 5755 | WREG32(VM_CONTEXT1_PAGE_TABLE_END_ADDR, rdev->vm_manager.max_pfn); |
5759 | for (i = 1; i < 16; i++) { | 5756 | for (i = 1; i < 16; i++) { |
5760 | if (i < 8) | 5757 | if (i < 8) |
5761 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), | 5758 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), |
5762 | rdev->gart.table_addr >> 12); | 5759 | rdev->vm_manager.saved_table_addr[i]); |
5763 | else | 5760 | else |
5764 | WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2), | 5761 | WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2), |
5765 | rdev->gart.table_addr >> 12); | 5762 | rdev->vm_manager.saved_table_addr[i]); |
5766 | } | 5763 | } |
5767 | 5764 | ||
5768 | /* enable context1-15 */ | 5765 | /* enable context1-15 */ |
@@ -5827,6 +5824,17 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev) | |||
5827 | */ | 5824 | */ |
5828 | static void cik_pcie_gart_disable(struct radeon_device *rdev) | 5825 | static void cik_pcie_gart_disable(struct radeon_device *rdev) |
5829 | { | 5826 | { |
5827 | unsigned i; | ||
5828 | |||
5829 | for (i = 1; i < 16; ++i) { | ||
5830 | uint32_t reg; | ||
5831 | if (i < 8) | ||
5832 | reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2); | ||
5833 | else | ||
5834 | reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2); | ||
5835 | rdev->vm_manager.saved_table_addr[i] = RREG32(reg); | ||
5836 | } | ||
5837 | |||
5830 | /* Disable all tables */ | 5838 | /* Disable all tables */ |
5831 | WREG32(VM_CONTEXT0_CNTL, 0); | 5839 | WREG32(VM_CONTEXT0_CNTL, 0); |
5832 | WREG32(VM_CONTEXT1_CNTL, 0); | 5840 | WREG32(VM_CONTEXT1_CNTL, 0); |
@@ -9555,6 +9563,9 @@ static void cik_pcie_gen3_enable(struct radeon_device *rdev) | |||
9555 | int ret, i; | 9563 | int ret, i; |
9556 | u16 tmp16; | 9564 | u16 tmp16; |
9557 | 9565 | ||
9566 | if (pci_is_root_bus(rdev->pdev->bus)) | ||
9567 | return; | ||
9568 | |||
9558 | if (radeon_pcie_gen2 == 0) | 9569 | if (radeon_pcie_gen2 == 0) |
9559 | return; | 9570 | return; |
9560 | 9571 | ||
@@ -9781,7 +9792,8 @@ static void cik_program_aspm(struct radeon_device *rdev) | |||
9781 | if (orig != data) | 9792 | if (orig != data) |
9782 | WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data); | 9793 | WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data); |
9783 | 9794 | ||
9784 | if (!disable_clkreq) { | 9795 | if (!disable_clkreq && |
9796 | !pci_is_root_bus(rdev->pdev->bus)) { | ||
9785 | struct pci_dev *root = rdev->pdev->bus->self; | 9797 | struct pci_dev *root = rdev->pdev->bus->self; |
9786 | u32 lnkcap; | 9798 | u32 lnkcap; |
9787 | 9799 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index ba89375f197f..3faee58946dd 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1271,7 +1271,7 @@ static int cayman_pcie_gart_enable(struct radeon_device *rdev) | |||
1271 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0); | 1271 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR + (i << 2), 0); |
1272 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn); | 1272 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR + (i << 2), rdev->vm_manager.max_pfn); |
1273 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), | 1273 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), |
1274 | rdev->gart.table_addr >> 12); | 1274 | rdev->vm_manager.saved_table_addr[i]); |
1275 | } | 1275 | } |
1276 | 1276 | ||
1277 | /* enable context1-7 */ | 1277 | /* enable context1-7 */ |
@@ -1303,6 +1303,13 @@ static int cayman_pcie_gart_enable(struct radeon_device *rdev) | |||
1303 | 1303 | ||
1304 | static void cayman_pcie_gart_disable(struct radeon_device *rdev) | 1304 | static void cayman_pcie_gart_disable(struct radeon_device *rdev) |
1305 | { | 1305 | { |
1306 | unsigned i; | ||
1307 | |||
1308 | for (i = 1; i < 8; ++i) { | ||
1309 | rdev->vm_manager.saved_table_addr[i] = RREG32( | ||
1310 | VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2)); | ||
1311 | } | ||
1312 | |||
1306 | /* Disable all tables */ | 1313 | /* Disable all tables */ |
1307 | WREG32(VM_CONTEXT0_CNTL, 0); | 1314 | WREG32(VM_CONTEXT0_CNTL, 0); |
1308 | WREG32(VM_CONTEXT1_CNTL, 0); | 1315 | WREG32(VM_CONTEXT1_CNTL, 0); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index e8bf0ea2dade..e616eb5f6e7a 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1812,7 +1812,6 @@ static void r600_gpu_init(struct radeon_device *rdev) | |||
1812 | { | 1812 | { |
1813 | u32 tiling_config; | 1813 | u32 tiling_config; |
1814 | u32 ramcfg; | 1814 | u32 ramcfg; |
1815 | u32 cc_rb_backend_disable; | ||
1816 | u32 cc_gc_shader_pipe_config; | 1815 | u32 cc_gc_shader_pipe_config; |
1817 | u32 tmp; | 1816 | u32 tmp; |
1818 | int i, j; | 1817 | int i, j; |
@@ -1939,29 +1938,20 @@ static void r600_gpu_init(struct radeon_device *rdev) | |||
1939 | } | 1938 | } |
1940 | tiling_config |= BANK_SWAPS(1); | 1939 | tiling_config |= BANK_SWAPS(1); |
1941 | 1940 | ||
1942 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; | ||
1943 | tmp = R6XX_MAX_BACKENDS - | ||
1944 | r600_count_pipe_bits((cc_rb_backend_disable >> 16) & R6XX_MAX_BACKENDS_MASK); | ||
1945 | if (tmp < rdev->config.r600.max_backends) { | ||
1946 | rdev->config.r600.max_backends = tmp; | ||
1947 | } | ||
1948 | |||
1949 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00; | 1941 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00; |
1950 | tmp = R6XX_MAX_PIPES - | ||
1951 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R6XX_MAX_PIPES_MASK); | ||
1952 | if (tmp < rdev->config.r600.max_pipes) { | ||
1953 | rdev->config.r600.max_pipes = tmp; | ||
1954 | } | ||
1955 | tmp = R6XX_MAX_SIMDS - | ||
1956 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); | ||
1957 | if (tmp < rdev->config.r600.max_simds) { | ||
1958 | rdev->config.r600.max_simds = tmp; | ||
1959 | } | ||
1960 | tmp = rdev->config.r600.max_simds - | 1942 | tmp = rdev->config.r600.max_simds - |
1961 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); | 1943 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); |
1962 | rdev->config.r600.active_simds = tmp; | 1944 | rdev->config.r600.active_simds = tmp; |
1963 | 1945 | ||
1964 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; | 1946 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; |
1947 | tmp = 0; | ||
1948 | for (i = 0; i < rdev->config.r600.max_backends; i++) | ||
1949 | tmp |= (1 << i); | ||
1950 | /* if all the backends are disabled, fix it up here */ | ||
1951 | if ((disabled_rb_mask & tmp) == tmp) { | ||
1952 | for (i = 0; i < rdev->config.r600.max_backends; i++) | ||
1953 | disabled_rb_mask &= ~(1 << i); | ||
1954 | } | ||
1965 | tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; | 1955 | tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; |
1966 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends, | 1956 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends, |
1967 | R6XX_MAX_BACKENDS, disabled_rb_mask); | 1957 | R6XX_MAX_BACKENDS, disabled_rb_mask); |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index b281886f6f51..5f05b4c84338 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -915,6 +915,8 @@ struct radeon_vm_manager { | |||
915 | u64 vram_base_offset; | 915 | u64 vram_base_offset; |
916 | /* is vm enabled? */ | 916 | /* is vm enabled? */ |
917 | bool enabled; | 917 | bool enabled; |
918 | /* for hw to save the PD addr on suspend/resume */ | ||
919 | uint32_t saved_table_addr[RADEON_NUM_VM]; | ||
918 | }; | 920 | }; |
919 | 921 | ||
920 | /* | 922 | /* |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 2983f17ea1b3..d9f5ce715c9b 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -1177,7 +1177,6 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
1177 | u32 hdp_host_path_cntl; | 1177 | u32 hdp_host_path_cntl; |
1178 | u32 sq_dyn_gpr_size_simd_ab_0; | 1178 | u32 sq_dyn_gpr_size_simd_ab_0; |
1179 | u32 gb_tiling_config = 0; | 1179 | u32 gb_tiling_config = 0; |
1180 | u32 cc_rb_backend_disable = 0; | ||
1181 | u32 cc_gc_shader_pipe_config = 0; | 1180 | u32 cc_gc_shader_pipe_config = 0; |
1182 | u32 mc_arb_ramcfg; | 1181 | u32 mc_arb_ramcfg; |
1183 | u32 db_debug4, tmp; | 1182 | u32 db_debug4, tmp; |
@@ -1311,21 +1310,7 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
1311 | WREG32(SPI_CONFIG_CNTL, 0); | 1310 | WREG32(SPI_CONFIG_CNTL, 0); |
1312 | } | 1311 | } |
1313 | 1312 | ||
1314 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; | ||
1315 | tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16); | ||
1316 | if (tmp < rdev->config.rv770.max_backends) { | ||
1317 | rdev->config.rv770.max_backends = tmp; | ||
1318 | } | ||
1319 | |||
1320 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; | 1313 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; |
1321 | tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK); | ||
1322 | if (tmp < rdev->config.rv770.max_pipes) { | ||
1323 | rdev->config.rv770.max_pipes = tmp; | ||
1324 | } | ||
1325 | tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); | ||
1326 | if (tmp < rdev->config.rv770.max_simds) { | ||
1327 | rdev->config.rv770.max_simds = tmp; | ||
1328 | } | ||
1329 | tmp = rdev->config.rv770.max_simds - | 1314 | tmp = rdev->config.rv770.max_simds - |
1330 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); | 1315 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); |
1331 | rdev->config.rv770.active_simds = tmp; | 1316 | rdev->config.rv770.active_simds = tmp; |
@@ -1348,6 +1333,14 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
1348 | rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; | 1333 | rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; |
1349 | 1334 | ||
1350 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; | 1335 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; |
1336 | tmp = 0; | ||
1337 | for (i = 0; i < rdev->config.rv770.max_backends; i++) | ||
1338 | tmp |= (1 << i); | ||
1339 | /* if all the backends are disabled, fix it up here */ | ||
1340 | if ((disabled_rb_mask & tmp) == tmp) { | ||
1341 | for (i = 0; i < rdev->config.rv770.max_backends; i++) | ||
1342 | disabled_rb_mask &= ~(1 << i); | ||
1343 | } | ||
1351 | tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; | 1344 | tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; |
1352 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, | 1345 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, |
1353 | R7XX_MAX_BACKENDS, disabled_rb_mask); | 1346 | R7XX_MAX_BACKENDS, disabled_rb_mask); |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index a1274a31405c..6bce40847753 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -4290,10 +4290,10 @@ static int si_pcie_gart_enable(struct radeon_device *rdev) | |||
4290 | for (i = 1; i < 16; i++) { | 4290 | for (i = 1; i < 16; i++) { |
4291 | if (i < 8) | 4291 | if (i < 8) |
4292 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), | 4292 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2), |
4293 | rdev->gart.table_addr >> 12); | 4293 | rdev->vm_manager.saved_table_addr[i]); |
4294 | else | 4294 | else |
4295 | WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2), | 4295 | WREG32(VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2), |
4296 | rdev->gart.table_addr >> 12); | 4296 | rdev->vm_manager.saved_table_addr[i]); |
4297 | } | 4297 | } |
4298 | 4298 | ||
4299 | /* enable context1-15 */ | 4299 | /* enable context1-15 */ |
@@ -4325,6 +4325,17 @@ static int si_pcie_gart_enable(struct radeon_device *rdev) | |||
4325 | 4325 | ||
4326 | static void si_pcie_gart_disable(struct radeon_device *rdev) | 4326 | static void si_pcie_gart_disable(struct radeon_device *rdev) |
4327 | { | 4327 | { |
4328 | unsigned i; | ||
4329 | |||
4330 | for (i = 1; i < 16; ++i) { | ||
4331 | uint32_t reg; | ||
4332 | if (i < 8) | ||
4333 | reg = VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (i << 2); | ||
4334 | else | ||
4335 | reg = VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((i - 8) << 2); | ||
4336 | rdev->vm_manager.saved_table_addr[i] = RREG32(reg); | ||
4337 | } | ||
4338 | |||
4328 | /* Disable all tables */ | 4339 | /* Disable all tables */ |
4329 | WREG32(VM_CONTEXT0_CNTL, 0); | 4340 | WREG32(VM_CONTEXT0_CNTL, 0); |
4330 | WREG32(VM_CONTEXT1_CNTL, 0); | 4341 | WREG32(VM_CONTEXT1_CNTL, 0); |
@@ -7177,6 +7188,9 @@ static void si_pcie_gen3_enable(struct radeon_device *rdev) | |||
7177 | int ret, i; | 7188 | int ret, i; |
7178 | u16 tmp16; | 7189 | u16 tmp16; |
7179 | 7190 | ||
7191 | if (pci_is_root_bus(rdev->pdev->bus)) | ||
7192 | return; | ||
7193 | |||
7180 | if (radeon_pcie_gen2 == 0) | 7194 | if (radeon_pcie_gen2 == 0) |
7181 | return; | 7195 | return; |
7182 | 7196 | ||
@@ -7454,7 +7468,8 @@ static void si_program_aspm(struct radeon_device *rdev) | |||
7454 | if (orig != data) | 7468 | if (orig != data) |
7455 | WREG32_PIF_PHY1(PB1_PIF_CNTL, data); | 7469 | WREG32_PIF_PHY1(PB1_PIF_CNTL, data); |
7456 | 7470 | ||
7457 | if (!disable_clkreq) { | 7471 | if (!disable_clkreq && |
7472 | !pci_is_root_bus(rdev->pdev->bus)) { | ||
7458 | struct pci_dev *root = rdev->pdev->bus->self; | 7473 | struct pci_dev *root = rdev->pdev->bus->self; |
7459 | u32 lnkcap; | 7474 | u32 lnkcap; |
7460 | 7475 | ||
diff --git a/drivers/gpu/drm/sti/Kconfig b/drivers/gpu/drm/sti/Kconfig index 2d9d4252d598..ae8850f3e63b 100644 --- a/drivers/gpu/drm/sti/Kconfig +++ b/drivers/gpu/drm/sti/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config DRM_STI | 1 | config DRM_STI |
2 | tristate "DRM Support for STMicroelectronics SoC stiH41x Series" | 2 | tristate "DRM Support for STMicroelectronics SoC stiH41x Series" |
3 | depends on DRM && (SOC_STIH415 || SOC_STIH416 || ARCH_MULTIPLATFORM) | 3 | depends on DRM && (SOC_STIH415 || SOC_STIH416 || ARCH_MULTIPLATFORM) |
4 | select RESET_CONTROLLER | ||
4 | select DRM_KMS_HELPER | 5 | select DRM_KMS_HELPER |
5 | select DRM_GEM_CMA_HELPER | 6 | select DRM_GEM_CMA_HELPER |
6 | select DRM_KMS_CMA_HELPER | 7 | select DRM_KMS_CMA_HELPER |
diff --git a/drivers/gpu/drm/sti/sti_drm_drv.c b/drivers/gpu/drm/sti/sti_drm_drv.c index a7cc24917a96..223d93c3a05d 100644 --- a/drivers/gpu/drm/sti/sti_drm_drv.c +++ b/drivers/gpu/drm/sti/sti_drm_drv.c | |||
@@ -201,8 +201,8 @@ static int sti_drm_platform_probe(struct platform_device *pdev) | |||
201 | master = platform_device_register_resndata(dev, | 201 | master = platform_device_register_resndata(dev, |
202 | DRIVER_NAME "__master", -1, | 202 | DRIVER_NAME "__master", -1, |
203 | NULL, 0, NULL, 0); | 203 | NULL, 0, NULL, 0); |
204 | if (!master) | 204 | if (IS_ERR(master)) |
205 | return -EINVAL; | 205 | return PTR_ERR(master); |
206 | 206 | ||
207 | platform_set_drvdata(pdev, master); | 207 | platform_set_drvdata(pdev, master); |
208 | return 0; | 208 | return 0; |
diff --git a/drivers/gpu/drm/sti/sti_hda.c b/drivers/gpu/drm/sti/sti_hda.c index 72d957f81c05..2ae9a9b73666 100644 --- a/drivers/gpu/drm/sti/sti_hda.c +++ b/drivers/gpu/drm/sti/sti_hda.c | |||
@@ -730,16 +730,16 @@ static int sti_hda_probe(struct platform_device *pdev) | |||
730 | return -ENOMEM; | 730 | return -ENOMEM; |
731 | } | 731 | } |
732 | hda->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); | 732 | hda->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); |
733 | if (IS_ERR(hda->regs)) | 733 | if (!hda->regs) |
734 | return PTR_ERR(hda->regs); | 734 | return -ENOMEM; |
735 | 735 | ||
736 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 736 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
737 | "video-dacs-ctrl"); | 737 | "video-dacs-ctrl"); |
738 | if (res) { | 738 | if (res) { |
739 | hda->video_dacs_ctrl = devm_ioremap_nocache(dev, res->start, | 739 | hda->video_dacs_ctrl = devm_ioremap_nocache(dev, res->start, |
740 | resource_size(res)); | 740 | resource_size(res)); |
741 | if (IS_ERR(hda->video_dacs_ctrl)) | 741 | if (!hda->video_dacs_ctrl) |
742 | return PTR_ERR(hda->video_dacs_ctrl); | 742 | return -ENOMEM; |
743 | } else { | 743 | } else { |
744 | /* If no existing video-dacs-ctrl resource continue the probe */ | 744 | /* If no existing video-dacs-ctrl resource continue the probe */ |
745 | DRM_DEBUG_DRIVER("No video-dacs-ctrl resource\n"); | 745 | DRM_DEBUG_DRIVER("No video-dacs-ctrl resource\n"); |
@@ -770,7 +770,7 @@ static int sti_hda_remove(struct platform_device *pdev) | |||
770 | return 0; | 770 | return 0; |
771 | } | 771 | } |
772 | 772 | ||
773 | static struct of_device_id hda_of_match[] = { | 773 | static const struct of_device_id hda_of_match[] = { |
774 | { .compatible = "st,stih416-hda", }, | 774 | { .compatible = "st,stih416-hda", }, |
775 | { .compatible = "st,stih407-hda", }, | 775 | { .compatible = "st,stih407-hda", }, |
776 | { /* end node */ } | 776 | { /* end node */ } |
diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c index 284e541d970d..ef93156a69c6 100644 --- a/drivers/gpu/drm/sti/sti_hdmi.c +++ b/drivers/gpu/drm/sti/sti_hdmi.c | |||
@@ -677,7 +677,7 @@ static const struct component_ops sti_hdmi_ops = { | |||
677 | .unbind = sti_hdmi_unbind, | 677 | .unbind = sti_hdmi_unbind, |
678 | }; | 678 | }; |
679 | 679 | ||
680 | static struct of_device_id hdmi_of_match[] = { | 680 | static const struct of_device_id hdmi_of_match[] = { |
681 | { | 681 | { |
682 | .compatible = "st,stih416-hdmi", | 682 | .compatible = "st,stih416-hdmi", |
683 | .data = &tx3g0c55phy_ops, | 683 | .data = &tx3g0c55phy_ops, |
@@ -713,8 +713,8 @@ static int sti_hdmi_probe(struct platform_device *pdev) | |||
713 | return -ENOMEM; | 713 | return -ENOMEM; |
714 | } | 714 | } |
715 | hdmi->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); | 715 | hdmi->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); |
716 | if (IS_ERR(hdmi->regs)) | 716 | if (!hdmi->regs) |
717 | return PTR_ERR(hdmi->regs); | 717 | return -ENOMEM; |
718 | 718 | ||
719 | if (of_device_is_compatible(np, "st,stih416-hdmi")) { | 719 | if (of_device_is_compatible(np, "st,stih416-hdmi")) { |
720 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 720 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
@@ -725,8 +725,8 @@ static int sti_hdmi_probe(struct platform_device *pdev) | |||
725 | } | 725 | } |
726 | hdmi->syscfg = devm_ioremap_nocache(dev, res->start, | 726 | hdmi->syscfg = devm_ioremap_nocache(dev, res->start, |
727 | resource_size(res)); | 727 | resource_size(res)); |
728 | if (IS_ERR(hdmi->syscfg)) | 728 | if (!hdmi->syscfg) |
729 | return PTR_ERR(hdmi->syscfg); | 729 | return -ENOMEM; |
730 | 730 | ||
731 | } | 731 | } |
732 | 732 | ||
diff --git a/drivers/gpu/drm/sti/sti_tvout.c b/drivers/gpu/drm/sti/sti_tvout.c index b69e26fee76e..b8afe490356a 100644 --- a/drivers/gpu/drm/sti/sti_tvout.c +++ b/drivers/gpu/drm/sti/sti_tvout.c | |||
@@ -591,8 +591,8 @@ static int sti_tvout_probe(struct platform_device *pdev) | |||
591 | return -ENOMEM; | 591 | return -ENOMEM; |
592 | } | 592 | } |
593 | tvout->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); | 593 | tvout->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); |
594 | if (IS_ERR(tvout->regs)) | 594 | if (!tvout->regs) |
595 | return PTR_ERR(tvout->regs); | 595 | return -ENOMEM; |
596 | 596 | ||
597 | /* get reset resources */ | 597 | /* get reset resources */ |
598 | tvout->reset = devm_reset_control_get(dev, "tvout"); | 598 | tvout->reset = devm_reset_control_get(dev, "tvout"); |
@@ -624,7 +624,7 @@ static int sti_tvout_remove(struct platform_device *pdev) | |||
624 | return 0; | 624 | return 0; |
625 | } | 625 | } |
626 | 626 | ||
627 | static struct of_device_id tvout_of_match[] = { | 627 | static const struct of_device_id tvout_of_match[] = { |
628 | { .compatible = "st,stih416-tvout", }, | 628 | { .compatible = "st,stih416-tvout", }, |
629 | { .compatible = "st,stih407-tvout", }, | 629 | { .compatible = "st,stih407-tvout", }, |
630 | { /* end node */ } | 630 | { /* end node */ } |
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index b7ba82960c79..9bf8637747a5 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
@@ -656,7 +656,6 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); | 656 | struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev); |
657 | struct dj_report *dj_report = (struct dj_report *) data; | 657 | struct dj_report *dj_report = (struct dj_report *) data; |
658 | unsigned long flags; | 658 | unsigned long flags; |
659 | bool report_processed = false; | ||
660 | 659 | ||
661 | dbg_hid("%s, size:%d\n", __func__, size); | 660 | dbg_hid("%s, size:%d\n", __func__, size); |
662 | 661 | ||
@@ -683,34 +682,42 @@ static int logi_dj_raw_event(struct hid_device *hdev, | |||
683 | * device (via hid_input_report() ) and return 1 so hid-core does not do | 682 | * device (via hid_input_report() ) and return 1 so hid-core does not do |
684 | * anything else with it. | 683 | * anything else with it. |
685 | */ | 684 | */ |
685 | |||
686 | /* case 1) */ | ||
687 | if (data[0] != REPORT_ID_DJ_SHORT) | ||
688 | return false; | ||
689 | |||
686 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || | 690 | if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) || |
687 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { | 691 | (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) { |
688 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | 692 | /* |
693 | * Device index is wrong, bail out. | ||
694 | * This driver can ignore safely the receiver notifications, | ||
695 | * so ignore those reports too. | ||
696 | */ | ||
697 | if (dj_report->device_index != DJ_RECEIVER_INDEX) | ||
698 | dev_err(&hdev->dev, "%s: invalid device index:%d\n", | ||
689 | __func__, dj_report->device_index); | 699 | __func__, dj_report->device_index); |
690 | return false; | 700 | return false; |
691 | } | 701 | } |
692 | 702 | ||
693 | spin_lock_irqsave(&djrcv_dev->lock, flags); | 703 | spin_lock_irqsave(&djrcv_dev->lock, flags); |
694 | if (dj_report->report_id == REPORT_ID_DJ_SHORT) { | 704 | switch (dj_report->report_type) { |
695 | switch (dj_report->report_type) { | 705 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: |
696 | case REPORT_TYPE_NOTIF_DEVICE_PAIRED: | 706 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: |
697 | case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED: | 707 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); |
698 | logi_dj_recv_queue_notification(djrcv_dev, dj_report); | 708 | break; |
699 | break; | 709 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: |
700 | case REPORT_TYPE_NOTIF_CONNECTION_STATUS: | 710 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == |
701 | if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] == | 711 | STATUS_LINKLOSS) { |
702 | STATUS_LINKLOSS) { | 712 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); |
703 | logi_dj_recv_forward_null_report(djrcv_dev, dj_report); | ||
704 | } | ||
705 | break; | ||
706 | default: | ||
707 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
708 | } | 713 | } |
709 | report_processed = true; | 714 | break; |
715 | default: | ||
716 | logi_dj_recv_forward_report(djrcv_dev, dj_report); | ||
710 | } | 717 | } |
711 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); | 718 | spin_unlock_irqrestore(&djrcv_dev->lock, flags); |
712 | 719 | ||
713 | return report_processed; | 720 | return true; |
714 | } | 721 | } |
715 | 722 | ||
716 | static int logi_dj_probe(struct hid_device *hdev, | 723 | static int logi_dj_probe(struct hid_device *hdev, |
diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h index 4a4000340ce1..daeb0aa4bee9 100644 --- a/drivers/hid/hid-logitech-dj.h +++ b/drivers/hid/hid-logitech-dj.h | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | #define DJ_MAX_PAIRED_DEVICES 6 | 28 | #define DJ_MAX_PAIRED_DEVICES 6 |
29 | #define DJ_MAX_NUMBER_NOTIFICATIONS 8 | 29 | #define DJ_MAX_NUMBER_NOTIFICATIONS 8 |
30 | #define DJ_RECEIVER_INDEX 0 | ||
30 | #define DJ_DEVICE_INDEX_MIN 1 | 31 | #define DJ_DEVICE_INDEX_MIN 1 |
31 | #define DJ_DEVICE_INDEX_MAX 6 | 32 | #define DJ_DEVICE_INDEX_MAX 6 |
32 | 33 | ||
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c index ecc2cbf300cc..29a74c1efcb8 100644 --- a/drivers/hid/hid-magicmouse.c +++ b/drivers/hid/hid-magicmouse.c | |||
@@ -290,6 +290,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, | |||
290 | if (size < 4 || ((size - 4) % 9) != 0) | 290 | if (size < 4 || ((size - 4) % 9) != 0) |
291 | return 0; | 291 | return 0; |
292 | npoints = (size - 4) / 9; | 292 | npoints = (size - 4) / 9; |
293 | if (npoints > 15) { | ||
294 | hid_warn(hdev, "invalid size value (%d) for TRACKPAD_REPORT_ID\n", | ||
295 | size); | ||
296 | return 0; | ||
297 | } | ||
293 | msc->ntouches = 0; | 298 | msc->ntouches = 0; |
294 | for (ii = 0; ii < npoints; ii++) | 299 | for (ii = 0; ii < npoints; ii++) |
295 | magicmouse_emit_touch(msc, ii, data + ii * 9 + 4); | 300 | magicmouse_emit_touch(msc, ii, data + ii * 9 + 4); |
@@ -307,6 +312,11 @@ static int magicmouse_raw_event(struct hid_device *hdev, | |||
307 | if (size < 6 || ((size - 6) % 8) != 0) | 312 | if (size < 6 || ((size - 6) % 8) != 0) |
308 | return 0; | 313 | return 0; |
309 | npoints = (size - 6) / 8; | 314 | npoints = (size - 6) / 8; |
315 | if (npoints > 15) { | ||
316 | hid_warn(hdev, "invalid size value (%d) for MOUSE_REPORT_ID\n", | ||
317 | size); | ||
318 | return 0; | ||
319 | } | ||
310 | msc->ntouches = 0; | 320 | msc->ntouches = 0; |
311 | for (ii = 0; ii < npoints; ii++) | 321 | for (ii = 0; ii < npoints; ii++) |
312 | magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); | 322 | magicmouse_emit_touch(msc, ii, data + ii * 8 + 6); |
diff --git a/drivers/hid/hid-picolcd_core.c b/drivers/hid/hid-picolcd_core.c index acbb021065ec..020df3c2e8b4 100644 --- a/drivers/hid/hid-picolcd_core.c +++ b/drivers/hid/hid-picolcd_core.c | |||
@@ -350,6 +350,12 @@ static int picolcd_raw_event(struct hid_device *hdev, | |||
350 | if (!data) | 350 | if (!data) |
351 | return 1; | 351 | return 1; |
352 | 352 | ||
353 | if (size > 64) { | ||
354 | hid_warn(hdev, "invalid size value (%d) for picolcd raw event\n", | ||
355 | size); | ||
356 | return 0; | ||
357 | } | ||
358 | |||
353 | if (report->id == REPORT_KEY_STATE) { | 359 | if (report->id == REPORT_KEY_STATE) { |
354 | if (data->input_keys) | 360 | if (data->input_keys) |
355 | ret = picolcd_raw_keypad(data, report, raw_data+1, size-1); | 361 | ret = picolcd_raw_keypad(data, report, raw_data+1, size-1); |
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 2785007e0e46..cd15e0801228 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -1688,6 +1688,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1688 | unsigned int key_size, opt_params; | 1688 | unsigned int key_size, opt_params; |
1689 | unsigned long long tmpll; | 1689 | unsigned long long tmpll; |
1690 | int ret; | 1690 | int ret; |
1691 | size_t iv_size_padding; | ||
1691 | struct dm_arg_set as; | 1692 | struct dm_arg_set as; |
1692 | const char *opt_string; | 1693 | const char *opt_string; |
1693 | char dummy; | 1694 | char dummy; |
@@ -1724,20 +1725,32 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1724 | 1725 | ||
1725 | cc->dmreq_start = sizeof(struct ablkcipher_request); | 1726 | cc->dmreq_start = sizeof(struct ablkcipher_request); |
1726 | cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc)); | 1727 | cc->dmreq_start += crypto_ablkcipher_reqsize(any_tfm(cc)); |
1727 | cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment()); | 1728 | cc->dmreq_start = ALIGN(cc->dmreq_start, __alignof__(struct dm_crypt_request)); |
1728 | cc->dmreq_start += crypto_ablkcipher_alignmask(any_tfm(cc)) & | 1729 | |
1729 | ~(crypto_tfm_ctx_alignment() - 1); | 1730 | if (crypto_ablkcipher_alignmask(any_tfm(cc)) < CRYPTO_MINALIGN) { |
1731 | /* Allocate the padding exactly */ | ||
1732 | iv_size_padding = -(cc->dmreq_start + sizeof(struct dm_crypt_request)) | ||
1733 | & crypto_ablkcipher_alignmask(any_tfm(cc)); | ||
1734 | } else { | ||
1735 | /* | ||
1736 | * If the cipher requires greater alignment than kmalloc | ||
1737 | * alignment, we don't know the exact position of the | ||
1738 | * initialization vector. We must assume worst case. | ||
1739 | */ | ||
1740 | iv_size_padding = crypto_ablkcipher_alignmask(any_tfm(cc)); | ||
1741 | } | ||
1730 | 1742 | ||
1731 | cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + | 1743 | cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + |
1732 | sizeof(struct dm_crypt_request) + cc->iv_size); | 1744 | sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size); |
1733 | if (!cc->req_pool) { | 1745 | if (!cc->req_pool) { |
1734 | ti->error = "Cannot allocate crypt request mempool"; | 1746 | ti->error = "Cannot allocate crypt request mempool"; |
1735 | goto bad; | 1747 | goto bad; |
1736 | } | 1748 | } |
1737 | 1749 | ||
1738 | cc->per_bio_data_size = ti->per_bio_data_size = | 1750 | cc->per_bio_data_size = ti->per_bio_data_size = |
1739 | sizeof(struct dm_crypt_io) + cc->dmreq_start + | 1751 | ALIGN(sizeof(struct dm_crypt_io) + cc->dmreq_start + |
1740 | sizeof(struct dm_crypt_request) + cc->iv_size; | 1752 | sizeof(struct dm_crypt_request) + iv_size_padding + cc->iv_size, |
1753 | ARCH_KMALLOC_MINALIGN); | ||
1741 | 1754 | ||
1742 | cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0); | 1755 | cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0); |
1743 | if (!cc->page_pool) { | 1756 | if (!cc->page_pool) { |
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index ce48aa72bb42..bde2fc072410 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
@@ -1754,7 +1754,7 @@ static int ab8500_probe(struct platform_device *pdev) | |||
1754 | if (ret) | 1754 | if (ret) |
1755 | return ret; | 1755 | return ret; |
1756 | 1756 | ||
1757 | #if CONFIG_DEBUG_FS | 1757 | #ifdef CONFIG_DEBUG_FS |
1758 | /* Pass to debugfs */ | 1758 | /* Pass to debugfs */ |
1759 | ab8500_debug_resources[0].start = ab8500->irq; | 1759 | ab8500_debug_resources[0].start = ab8500->irq; |
1760 | ab8500_debug_resources[0].end = ab8500->irq; | 1760 | ab8500_debug_resources[0].end = ab8500->irq; |
diff --git a/drivers/mfd/htc-i2cpld.c b/drivers/mfd/htc-i2cpld.c index b44f0203983b..6bdb78c2ac77 100644 --- a/drivers/mfd/htc-i2cpld.c +++ b/drivers/mfd/htc-i2cpld.c | |||
@@ -404,7 +404,7 @@ static int htcpld_register_chip_i2c( | |||
404 | } | 404 | } |
405 | 405 | ||
406 | i2c_set_clientdata(client, chip); | 406 | i2c_set_clientdata(client, chip); |
407 | snprintf(client->name, I2C_NAME_SIZE, "Chip_0x%d", client->addr); | 407 | snprintf(client->name, I2C_NAME_SIZE, "Chip_0x%x", client->addr); |
408 | chip->client = client; | 408 | chip->client = client; |
409 | 409 | ||
410 | /* Reset the chip */ | 410 | /* Reset the chip */ |
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c index 33a9234b701c..83dab2f0a50e 100644 --- a/drivers/mfd/omap-usb-host.c +++ b/drivers/mfd/omap-usb-host.c | |||
@@ -647,7 +647,7 @@ static int usbhs_omap_probe(struct platform_device *pdev) | |||
647 | default: | 647 | default: |
648 | omap->nports = OMAP3_HS_USB_PORTS; | 648 | omap->nports = OMAP3_HS_USB_PORTS; |
649 | dev_dbg(dev, | 649 | dev_dbg(dev, |
650 | "USB HOST Rev:0x%d not recognized, assuming %d ports\n", | 650 | "USB HOST Rev:0x%x not recognized, assuming %d ports\n", |
651 | omap->usbhs_rev, omap->nports); | 651 | omap->usbhs_rev, omap->nports); |
652 | break; | 652 | break; |
653 | } | 653 | } |
diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c index 3bc969a5916b..4d3ff3771491 100644 --- a/drivers/mfd/twl4030-power.c +++ b/drivers/mfd/twl4030-power.c | |||
@@ -724,24 +724,24 @@ static struct twl4030_script *omap3_idle_scripts[] = { | |||
724 | * above. | 724 | * above. |
725 | */ | 725 | */ |
726 | static struct twl4030_resconfig omap3_idle_rconfig[] = { | 726 | static struct twl4030_resconfig omap3_idle_rconfig[] = { |
727 | TWL_REMAP_SLEEP(RES_VAUX1, DEV_GRP_NULL, 0, 0), | 727 | TWL_REMAP_SLEEP(RES_VAUX1, TWL4030_RESCONFIG_UNDEF, 0, 0), |
728 | TWL_REMAP_SLEEP(RES_VAUX2, DEV_GRP_NULL, 0, 0), | 728 | TWL_REMAP_SLEEP(RES_VAUX2, TWL4030_RESCONFIG_UNDEF, 0, 0), |
729 | TWL_REMAP_SLEEP(RES_VAUX3, DEV_GRP_NULL, 0, 0), | 729 | TWL_REMAP_SLEEP(RES_VAUX3, TWL4030_RESCONFIG_UNDEF, 0, 0), |
730 | TWL_REMAP_SLEEP(RES_VAUX4, DEV_GRP_NULL, 0, 0), | 730 | TWL_REMAP_SLEEP(RES_VAUX4, TWL4030_RESCONFIG_UNDEF, 0, 0), |
731 | TWL_REMAP_SLEEP(RES_VMMC1, DEV_GRP_NULL, 0, 0), | 731 | TWL_REMAP_SLEEP(RES_VMMC1, TWL4030_RESCONFIG_UNDEF, 0, 0), |
732 | TWL_REMAP_SLEEP(RES_VMMC2, DEV_GRP_NULL, 0, 0), | 732 | TWL_REMAP_SLEEP(RES_VMMC2, TWL4030_RESCONFIG_UNDEF, 0, 0), |
733 | TWL_REMAP_OFF(RES_VPLL1, DEV_GRP_P1, 3, 1), | 733 | TWL_REMAP_OFF(RES_VPLL1, DEV_GRP_P1, 3, 1), |
734 | TWL_REMAP_SLEEP(RES_VPLL2, DEV_GRP_P1, 0, 0), | 734 | TWL_REMAP_SLEEP(RES_VPLL2, DEV_GRP_P1, 0, 0), |
735 | TWL_REMAP_SLEEP(RES_VSIM, DEV_GRP_NULL, 0, 0), | 735 | TWL_REMAP_SLEEP(RES_VSIM, TWL4030_RESCONFIG_UNDEF, 0, 0), |
736 | TWL_REMAP_SLEEP(RES_VDAC, DEV_GRP_NULL, 0, 0), | 736 | TWL_REMAP_SLEEP(RES_VDAC, TWL4030_RESCONFIG_UNDEF, 0, 0), |
737 | TWL_REMAP_SLEEP(RES_VINTANA1, TWL_DEV_GRP_P123, 1, 2), | 737 | TWL_REMAP_SLEEP(RES_VINTANA1, TWL_DEV_GRP_P123, 1, 2), |
738 | TWL_REMAP_SLEEP(RES_VINTANA2, TWL_DEV_GRP_P123, 0, 2), | 738 | TWL_REMAP_SLEEP(RES_VINTANA2, TWL_DEV_GRP_P123, 0, 2), |
739 | TWL_REMAP_SLEEP(RES_VINTDIG, TWL_DEV_GRP_P123, 1, 2), | 739 | TWL_REMAP_SLEEP(RES_VINTDIG, TWL_DEV_GRP_P123, 1, 2), |
740 | TWL_REMAP_SLEEP(RES_VIO, TWL_DEV_GRP_P123, 2, 2), | 740 | TWL_REMAP_SLEEP(RES_VIO, TWL_DEV_GRP_P123, 2, 2), |
741 | TWL_REMAP_OFF(RES_VDD1, DEV_GRP_P1, 4, 1), | 741 | TWL_REMAP_OFF(RES_VDD1, DEV_GRP_P1, 4, 1), |
742 | TWL_REMAP_OFF(RES_VDD2, DEV_GRP_P1, 3, 1), | 742 | TWL_REMAP_OFF(RES_VDD2, DEV_GRP_P1, 3, 1), |
743 | TWL_REMAP_SLEEP(RES_VUSB_1V5, DEV_GRP_NULL, 0, 0), | 743 | TWL_REMAP_SLEEP(RES_VUSB_1V5, TWL4030_RESCONFIG_UNDEF, 0, 0), |
744 | TWL_REMAP_SLEEP(RES_VUSB_1V8, DEV_GRP_NULL, 0, 0), | 744 | TWL_REMAP_SLEEP(RES_VUSB_1V8, TWL4030_RESCONFIG_UNDEF, 0, 0), |
745 | TWL_REMAP_SLEEP(RES_VUSB_3V1, TWL_DEV_GRP_P123, 0, 0), | 745 | TWL_REMAP_SLEEP(RES_VUSB_3V1, TWL_DEV_GRP_P123, 0, 0), |
746 | /* Resource #20 USB charge pump skipped */ | 746 | /* Resource #20 USB charge pump skipped */ |
747 | TWL_REMAP_SLEEP(RES_REGEN, TWL_DEV_GRP_P123, 2, 1), | 747 | TWL_REMAP_SLEEP(RES_REGEN, TWL_DEV_GRP_P123, 2, 1), |
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c index 324e1de93687..2da05c0e113d 100644 --- a/drivers/misc/mei/client.c +++ b/drivers/misc/mei/client.c | |||
@@ -601,6 +601,7 @@ int mei_cl_connect(struct mei_cl *cl, struct file *file) | |||
601 | cl->timer_count = MEI_CONNECT_TIMEOUT; | 601 | cl->timer_count = MEI_CONNECT_TIMEOUT; |
602 | list_add_tail(&cb->list, &dev->ctrl_rd_list.list); | 602 | list_add_tail(&cb->list, &dev->ctrl_rd_list.list); |
603 | } else { | 603 | } else { |
604 | cl->state = MEI_FILE_INITIALIZING; | ||
604 | list_add_tail(&cb->list, &dev->ctrl_wr_list.list); | 605 | list_add_tail(&cb->list, &dev->ctrl_wr_list.list); |
605 | } | 606 | } |
606 | 607 | ||
diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c index 3095fc514a65..5ccc23bc7690 100644 --- a/drivers/misc/mei/nfc.c +++ b/drivers/misc/mei/nfc.c | |||
@@ -342,9 +342,10 @@ static int mei_nfc_send(struct mei_cl_device *cldev, u8 *buf, size_t length) | |||
342 | ndev = (struct mei_nfc_dev *) cldev->priv_data; | 342 | ndev = (struct mei_nfc_dev *) cldev->priv_data; |
343 | dev = ndev->cl->dev; | 343 | dev = ndev->cl->dev; |
344 | 344 | ||
345 | err = -ENOMEM; | ||
345 | mei_buf = kzalloc(length + MEI_NFC_HEADER_SIZE, GFP_KERNEL); | 346 | mei_buf = kzalloc(length + MEI_NFC_HEADER_SIZE, GFP_KERNEL); |
346 | if (!mei_buf) | 347 | if (!mei_buf) |
347 | return -ENOMEM; | 348 | goto out; |
348 | 349 | ||
349 | hdr = (struct mei_nfc_hci_hdr *) mei_buf; | 350 | hdr = (struct mei_nfc_hci_hdr *) mei_buf; |
350 | hdr->cmd = MEI_NFC_CMD_HCI_SEND; | 351 | hdr->cmd = MEI_NFC_CMD_HCI_SEND; |
@@ -354,12 +355,9 @@ static int mei_nfc_send(struct mei_cl_device *cldev, u8 *buf, size_t length) | |||
354 | hdr->data_size = length; | 355 | hdr->data_size = length; |
355 | 356 | ||
356 | memcpy(mei_buf + MEI_NFC_HEADER_SIZE, buf, length); | 357 | memcpy(mei_buf + MEI_NFC_HEADER_SIZE, buf, length); |
357 | |||
358 | err = __mei_cl_send(ndev->cl, mei_buf, length + MEI_NFC_HEADER_SIZE); | 358 | err = __mei_cl_send(ndev->cl, mei_buf, length + MEI_NFC_HEADER_SIZE); |
359 | if (err < 0) | 359 | if (err < 0) |
360 | return err; | 360 | goto out; |
361 | |||
362 | kfree(mei_buf); | ||
363 | 361 | ||
364 | if (!wait_event_interruptible_timeout(ndev->send_wq, | 362 | if (!wait_event_interruptible_timeout(ndev->send_wq, |
365 | ndev->recv_req_id == ndev->req_id, HZ)) { | 363 | ndev->recv_req_id == ndev->req_id, HZ)) { |
@@ -368,7 +366,8 @@ static int mei_nfc_send(struct mei_cl_device *cldev, u8 *buf, size_t length) | |||
368 | } else { | 366 | } else { |
369 | ndev->req_id++; | 367 | ndev->req_id++; |
370 | } | 368 | } |
371 | 369 | out: | |
370 | kfree(mei_buf); | ||
372 | return err; | 371 | return err; |
373 | } | 372 | } |
374 | 373 | ||
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c index f0ed92e210a1..5967b385141b 100644 --- a/drivers/mtd/nand/omap2.c +++ b/drivers/mtd/nand/omap2.c | |||
@@ -931,7 +931,7 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat, | |||
931 | u32 val; | 931 | u32 val; |
932 | 932 | ||
933 | val = readl(info->reg.gpmc_ecc_config); | 933 | val = readl(info->reg.gpmc_ecc_config); |
934 | if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs) | 934 | if (((val >> ECC_CONFIG_CS_SHIFT) & CS_MASK) != info->gpmc_cs) |
935 | return -EINVAL; | 935 | return -EINVAL; |
936 | 936 | ||
937 | /* read ecc result */ | 937 | /* read ecc result */ |
@@ -1794,9 +1794,12 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
1794 | } | 1794 | } |
1795 | 1795 | ||
1796 | /* populate MTD interface based on ECC scheme */ | 1796 | /* populate MTD interface based on ECC scheme */ |
1797 | nand_chip->ecc.layout = &omap_oobinfo; | ||
1798 | ecclayout = &omap_oobinfo; | 1797 | ecclayout = &omap_oobinfo; |
1799 | switch (info->ecc_opt) { | 1798 | switch (info->ecc_opt) { |
1799 | case OMAP_ECC_HAM1_CODE_SW: | ||
1800 | nand_chip->ecc.mode = NAND_ECC_SOFT; | ||
1801 | break; | ||
1802 | |||
1800 | case OMAP_ECC_HAM1_CODE_HW: | 1803 | case OMAP_ECC_HAM1_CODE_HW: |
1801 | pr_info("nand: using OMAP_ECC_HAM1_CODE_HW\n"); | 1804 | pr_info("nand: using OMAP_ECC_HAM1_CODE_HW\n"); |
1802 | nand_chip->ecc.mode = NAND_ECC_HW; | 1805 | nand_chip->ecc.mode = NAND_ECC_HW; |
@@ -1848,7 +1851,7 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
1848 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1851 | nand_chip->ecc.priv = nand_bch_init(mtd, |
1849 | nand_chip->ecc.size, | 1852 | nand_chip->ecc.size, |
1850 | nand_chip->ecc.bytes, | 1853 | nand_chip->ecc.bytes, |
1851 | &nand_chip->ecc.layout); | 1854 | &ecclayout); |
1852 | if (!nand_chip->ecc.priv) { | 1855 | if (!nand_chip->ecc.priv) { |
1853 | pr_err("nand: error: unable to use s/w BCH library\n"); | 1856 | pr_err("nand: error: unable to use s/w BCH library\n"); |
1854 | err = -EINVAL; | 1857 | err = -EINVAL; |
@@ -1923,7 +1926,7 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
1923 | nand_chip->ecc.priv = nand_bch_init(mtd, | 1926 | nand_chip->ecc.priv = nand_bch_init(mtd, |
1924 | nand_chip->ecc.size, | 1927 | nand_chip->ecc.size, |
1925 | nand_chip->ecc.bytes, | 1928 | nand_chip->ecc.bytes, |
1926 | &nand_chip->ecc.layout); | 1929 | &ecclayout); |
1927 | if (!nand_chip->ecc.priv) { | 1930 | if (!nand_chip->ecc.priv) { |
1928 | pr_err("nand: error: unable to use s/w BCH library\n"); | 1931 | pr_err("nand: error: unable to use s/w BCH library\n"); |
1929 | err = -EINVAL; | 1932 | err = -EINVAL; |
@@ -2012,6 +2015,9 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
2012 | goto return_error; | 2015 | goto return_error; |
2013 | } | 2016 | } |
2014 | 2017 | ||
2018 | if (info->ecc_opt == OMAP_ECC_HAM1_CODE_SW) | ||
2019 | goto scan_tail; | ||
2020 | |||
2015 | /* all OOB bytes from oobfree->offset till end off OOB are free */ | 2021 | /* all OOB bytes from oobfree->offset till end off OOB are free */ |
2016 | ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset; | 2022 | ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset; |
2017 | /* check if NAND device's OOB is enough to store ECC signatures */ | 2023 | /* check if NAND device's OOB is enough to store ECC signatures */ |
@@ -2021,7 +2027,9 @@ static int omap_nand_probe(struct platform_device *pdev) | |||
2021 | err = -EINVAL; | 2027 | err = -EINVAL; |
2022 | goto return_error; | 2028 | goto return_error; |
2023 | } | 2029 | } |
2030 | nand_chip->ecc.layout = ecclayout; | ||
2024 | 2031 | ||
2032 | scan_tail: | ||
2025 | /* second phase scan */ | 2033 | /* second phase scan */ |
2026 | if (nand_scan_tail(mtd)) { | 2034 | if (nand_scan_tail(mtd)) { |
2027 | err = -ENXIO; | 2035 | err = -ENXIO; |
diff --git a/drivers/pinctrl/nomadik/pinctrl-abx500.c b/drivers/pinctrl/nomadik/pinctrl-abx500.c index a53a689a2bfa..8c6fd8d4dd3c 100644 --- a/drivers/pinctrl/nomadik/pinctrl-abx500.c +++ b/drivers/pinctrl/nomadik/pinctrl-abx500.c | |||
@@ -620,8 +620,7 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s, | |||
620 | } else | 620 | } else |
621 | seq_printf(s, " %-9s", chip->get(chip, offset) ? "hi" : "lo"); | 621 | seq_printf(s, " %-9s", chip->get(chip, offset) ? "hi" : "lo"); |
622 | 622 | ||
623 | if (pctldev) | 623 | mode = abx500_get_mode(pctldev, chip, offset); |
624 | mode = abx500_get_mode(pctldev, chip, offset); | ||
625 | 624 | ||
626 | seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]); | 625 | seq_printf(s, " %s", (mode < 0) ? "unknown" : modes[mode]); |
627 | 626 | ||
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c index af1ba4fc150d..60464a2648aa 100644 --- a/drivers/pinctrl/pinctrl-at91.c +++ b/drivers/pinctrl/pinctrl-at91.c | |||
@@ -497,10 +497,10 @@ static struct at91_pinctrl_mux_ops at91sam9x5_ops = { | |||
497 | static void at91_pin_dbg(const struct device *dev, const struct at91_pmx_pin *pin) | 497 | static void at91_pin_dbg(const struct device *dev, const struct at91_pmx_pin *pin) |
498 | { | 498 | { |
499 | if (pin->mux) { | 499 | if (pin->mux) { |
500 | dev_dbg(dev, "pio%c%d configured as periph%c with conf = 0x%lu\n", | 500 | dev_dbg(dev, "pio%c%d configured as periph%c with conf = 0x%lx\n", |
501 | pin->bank + 'A', pin->pin, pin->mux - 1 + 'A', pin->conf); | 501 | pin->bank + 'A', pin->pin, pin->mux - 1 + 'A', pin->conf); |
502 | } else { | 502 | } else { |
503 | dev_dbg(dev, "pio%c%d configured as gpio with conf = 0x%lu\n", | 503 | dev_dbg(dev, "pio%c%d configured as gpio with conf = 0x%lx\n", |
504 | pin->bank + 'A', pin->pin, pin->conf); | 504 | pin->bank + 'A', pin->pin, pin->conf); |
505 | } | 505 | } |
506 | } | 506 | } |
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 5e8b2e04cd7a..0c372a300cb8 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -438,7 +438,7 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) | |||
438 | int reg, ret, mask; | 438 | int reg, ret, mask; |
439 | unsigned long flags; | 439 | unsigned long flags; |
440 | u8 bit; | 440 | u8 bit; |
441 | u32 data; | 441 | u32 data, rmask; |
442 | 442 | ||
443 | if (iomux_num > 3) | 443 | if (iomux_num > 3) |
444 | return -EINVAL; | 444 | return -EINVAL; |
@@ -478,8 +478,9 @@ static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) | |||
478 | spin_lock_irqsave(&bank->slock, flags); | 478 | spin_lock_irqsave(&bank->slock, flags); |
479 | 479 | ||
480 | data = (mask << (bit + 16)); | 480 | data = (mask << (bit + 16)); |
481 | rmask = data | (data >> 16); | ||
481 | data |= (mux & mask) << bit; | 482 | data |= (mux & mask) << bit; |
482 | ret = regmap_write(regmap, reg, data); | 483 | ret = regmap_update_bits(regmap, reg, rmask, data); |
483 | 484 | ||
484 | spin_unlock_irqrestore(&bank->slock, flags); | 485 | spin_unlock_irqrestore(&bank->slock, flags); |
485 | 486 | ||
@@ -634,7 +635,7 @@ static int rk3288_set_drive(struct rockchip_pin_bank *bank, int pin_num, | |||
634 | struct regmap *regmap; | 635 | struct regmap *regmap; |
635 | unsigned long flags; | 636 | unsigned long flags; |
636 | int reg, ret, i; | 637 | int reg, ret, i; |
637 | u32 data; | 638 | u32 data, rmask; |
638 | u8 bit; | 639 | u8 bit; |
639 | 640 | ||
640 | rk3288_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); | 641 | rk3288_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); |
@@ -657,9 +658,10 @@ static int rk3288_set_drive(struct rockchip_pin_bank *bank, int pin_num, | |||
657 | 658 | ||
658 | /* enable the write to the equivalent lower bits */ | 659 | /* enable the write to the equivalent lower bits */ |
659 | data = ((1 << RK3288_DRV_BITS_PER_PIN) - 1) << (bit + 16); | 660 | data = ((1 << RK3288_DRV_BITS_PER_PIN) - 1) << (bit + 16); |
661 | rmask = data | (data >> 16); | ||
660 | data |= (ret << bit); | 662 | data |= (ret << bit); |
661 | 663 | ||
662 | ret = regmap_write(regmap, reg, data); | 664 | ret = regmap_update_bits(regmap, reg, rmask, data); |
663 | spin_unlock_irqrestore(&bank->slock, flags); | 665 | spin_unlock_irqrestore(&bank->slock, flags); |
664 | 666 | ||
665 | return ret; | 667 | return ret; |
@@ -722,7 +724,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, | |||
722 | int reg, ret; | 724 | int reg, ret; |
723 | unsigned long flags; | 725 | unsigned long flags; |
724 | u8 bit; | 726 | u8 bit; |
725 | u32 data; | 727 | u32 data, rmask; |
726 | 728 | ||
727 | dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n", | 729 | dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n", |
728 | bank->bank_num, pin_num, pull); | 730 | bank->bank_num, pin_num, pull); |
@@ -750,6 +752,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, | |||
750 | 752 | ||
751 | /* enable the write to the equivalent lower bits */ | 753 | /* enable the write to the equivalent lower bits */ |
752 | data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); | 754 | data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); |
755 | rmask = data | (data >> 16); | ||
753 | 756 | ||
754 | switch (pull) { | 757 | switch (pull) { |
755 | case PIN_CONFIG_BIAS_DISABLE: | 758 | case PIN_CONFIG_BIAS_DISABLE: |
@@ -770,7 +773,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank, | |||
770 | return -EINVAL; | 773 | return -EINVAL; |
771 | } | 774 | } |
772 | 775 | ||
773 | ret = regmap_write(regmap, reg, data); | 776 | ret = regmap_update_bits(regmap, reg, rmask, data); |
774 | 777 | ||
775 | spin_unlock_irqrestore(&bank->slock, flags); | 778 | spin_unlock_irqrestore(&bank->slock, flags); |
776 | break; | 779 | break; |
diff --git a/drivers/pinctrl/pinctrl-tegra-xusb.c b/drivers/pinctrl/pinctrl-tegra-xusb.c index a06620474845..e641b4226c42 100644 --- a/drivers/pinctrl/pinctrl-tegra-xusb.c +++ b/drivers/pinctrl/pinctrl-tegra-xusb.c | |||
@@ -680,7 +680,7 @@ static struct phy *tegra_xusb_padctl_xlate(struct device *dev, | |||
680 | if (args->args_count <= 0) | 680 | if (args->args_count <= 0) |
681 | return ERR_PTR(-EINVAL); | 681 | return ERR_PTR(-EINVAL); |
682 | 682 | ||
683 | if (index > ARRAY_SIZE(padctl->phys)) | 683 | if (index >= ARRAY_SIZE(padctl->phys)) |
684 | return ERR_PTR(-EINVAL); | 684 | return ERR_PTR(-EINVAL); |
685 | 685 | ||
686 | return padctl->phys[index]; | 686 | return padctl->phys[index]; |
@@ -930,7 +930,8 @@ static int tegra_xusb_padctl_probe(struct platform_device *pdev) | |||
930 | 930 | ||
931 | padctl->provider = devm_of_phy_provider_register(&pdev->dev, | 931 | padctl->provider = devm_of_phy_provider_register(&pdev->dev, |
932 | tegra_xusb_padctl_xlate); | 932 | tegra_xusb_padctl_xlate); |
933 | if (err < 0) { | 933 | if (IS_ERR(padctl->provider)) { |
934 | err = PTR_ERR(padctl->provider); | ||
934 | dev_err(&pdev->dev, "failed to register PHYs: %d\n", err); | 935 | dev_err(&pdev->dev, "failed to register PHYs: %d\n", err); |
935 | goto unregister; | 936 | goto unregister; |
936 | } | 937 | } |
diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index 003bfd874a61..d7154ed0b0eb 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c | |||
@@ -127,14 +127,10 @@ static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type) | |||
127 | struct irq_chip *chip = irq_data_get_irq_chip(irqd); | 127 | struct irq_chip *chip = irq_data_get_irq_chip(irqd); |
128 | struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip); | 128 | struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip); |
129 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); | 129 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); |
130 | struct samsung_pin_bank_type *bank_type = bank->type; | ||
131 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | 130 | struct samsung_pinctrl_drv_data *d = bank->drvdata; |
132 | unsigned int pin = irqd->hwirq; | 131 | unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq; |
133 | unsigned int shift = EXYNOS_EINT_CON_LEN * pin; | ||
134 | unsigned int con, trig_type; | 132 | unsigned int con, trig_type; |
135 | unsigned long reg_con = our_chip->eint_con + bank->eint_offset; | 133 | unsigned long reg_con = our_chip->eint_con + bank->eint_offset; |
136 | unsigned long flags; | ||
137 | unsigned int mask; | ||
138 | 134 | ||
139 | switch (type) { | 135 | switch (type) { |
140 | case IRQ_TYPE_EDGE_RISING: | 136 | case IRQ_TYPE_EDGE_RISING: |
@@ -167,8 +163,32 @@ static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type) | |||
167 | con |= trig_type << shift; | 163 | con |= trig_type << shift; |
168 | writel(con, d->virt_base + reg_con); | 164 | writel(con, d->virt_base + reg_con); |
169 | 165 | ||
166 | return 0; | ||
167 | } | ||
168 | |||
169 | static int exynos_irq_request_resources(struct irq_data *irqd) | ||
170 | { | ||
171 | struct irq_chip *chip = irq_data_get_irq_chip(irqd); | ||
172 | struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip); | ||
173 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); | ||
174 | struct samsung_pin_bank_type *bank_type = bank->type; | ||
175 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
176 | unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq; | ||
177 | unsigned long reg_con = our_chip->eint_con + bank->eint_offset; | ||
178 | unsigned long flags; | ||
179 | unsigned int mask; | ||
180 | unsigned int con; | ||
181 | int ret; | ||
182 | |||
183 | ret = gpio_lock_as_irq(&bank->gpio_chip, irqd->hwirq); | ||
184 | if (ret) { | ||
185 | dev_err(bank->gpio_chip.dev, "unable to lock pin %s-%lu IRQ\n", | ||
186 | bank->name, irqd->hwirq); | ||
187 | return ret; | ||
188 | } | ||
189 | |||
170 | reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC]; | 190 | reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC]; |
171 | shift = pin * bank_type->fld_width[PINCFG_TYPE_FUNC]; | 191 | shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC]; |
172 | mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1; | 192 | mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1; |
173 | 193 | ||
174 | spin_lock_irqsave(&bank->slock, flags); | 194 | spin_lock_irqsave(&bank->slock, flags); |
@@ -180,9 +200,42 @@ static int exynos_irq_set_type(struct irq_data *irqd, unsigned int type) | |||
180 | 200 | ||
181 | spin_unlock_irqrestore(&bank->slock, flags); | 201 | spin_unlock_irqrestore(&bank->slock, flags); |
182 | 202 | ||
203 | exynos_irq_unmask(irqd); | ||
204 | |||
183 | return 0; | 205 | return 0; |
184 | } | 206 | } |
185 | 207 | ||
208 | static void exynos_irq_release_resources(struct irq_data *irqd) | ||
209 | { | ||
210 | struct irq_chip *chip = irq_data_get_irq_chip(irqd); | ||
211 | struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip); | ||
212 | struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); | ||
213 | struct samsung_pin_bank_type *bank_type = bank->type; | ||
214 | struct samsung_pinctrl_drv_data *d = bank->drvdata; | ||
215 | unsigned int shift = EXYNOS_EINT_CON_LEN * irqd->hwirq; | ||
216 | unsigned long reg_con = our_chip->eint_con + bank->eint_offset; | ||
217 | unsigned long flags; | ||
218 | unsigned int mask; | ||
219 | unsigned int con; | ||
220 | |||
221 | reg_con = bank->pctl_offset + bank_type->reg_offset[PINCFG_TYPE_FUNC]; | ||
222 | shift = irqd->hwirq * bank_type->fld_width[PINCFG_TYPE_FUNC]; | ||
223 | mask = (1 << bank_type->fld_width[PINCFG_TYPE_FUNC]) - 1; | ||
224 | |||
225 | exynos_irq_mask(irqd); | ||
226 | |||
227 | spin_lock_irqsave(&bank->slock, flags); | ||
228 | |||
229 | con = readl(d->virt_base + reg_con); | ||
230 | con &= ~(mask << shift); | ||
231 | con |= FUNC_INPUT << shift; | ||
232 | writel(con, d->virt_base + reg_con); | ||
233 | |||
234 | spin_unlock_irqrestore(&bank->slock, flags); | ||
235 | |||
236 | gpio_unlock_as_irq(&bank->gpio_chip, irqd->hwirq); | ||
237 | } | ||
238 | |||
186 | /* | 239 | /* |
187 | * irq_chip for gpio interrupts. | 240 | * irq_chip for gpio interrupts. |
188 | */ | 241 | */ |
@@ -193,6 +246,8 @@ static struct exynos_irq_chip exynos_gpio_irq_chip = { | |||
193 | .irq_mask = exynos_irq_mask, | 246 | .irq_mask = exynos_irq_mask, |
194 | .irq_ack = exynos_irq_ack, | 247 | .irq_ack = exynos_irq_ack, |
195 | .irq_set_type = exynos_irq_set_type, | 248 | .irq_set_type = exynos_irq_set_type, |
249 | .irq_request_resources = exynos_irq_request_resources, | ||
250 | .irq_release_resources = exynos_irq_release_resources, | ||
196 | }, | 251 | }, |
197 | .eint_con = EXYNOS_GPIO_ECON_OFFSET, | 252 | .eint_con = EXYNOS_GPIO_ECON_OFFSET, |
198 | .eint_mask = EXYNOS_GPIO_EMASK_OFFSET, | 253 | .eint_mask = EXYNOS_GPIO_EMASK_OFFSET, |
@@ -336,6 +391,8 @@ static struct exynos_irq_chip exynos_wkup_irq_chip = { | |||
336 | .irq_ack = exynos_irq_ack, | 391 | .irq_ack = exynos_irq_ack, |
337 | .irq_set_type = exynos_irq_set_type, | 392 | .irq_set_type = exynos_irq_set_type, |
338 | .irq_set_wake = exynos_wkup_irq_set_wake, | 393 | .irq_set_wake = exynos_wkup_irq_set_wake, |
394 | .irq_request_resources = exynos_irq_request_resources, | ||
395 | .irq_release_resources = exynos_irq_release_resources, | ||
339 | }, | 396 | }, |
340 | .eint_con = EXYNOS_WKUP_ECON_OFFSET, | 397 | .eint_con = EXYNOS_WKUP_ECON_OFFSET, |
341 | .eint_mask = EXYNOS_WKUP_EMASK_OFFSET, | 398 | .eint_mask = EXYNOS_WKUP_EMASK_OFFSET, |
diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.h b/drivers/pinctrl/samsung/pinctrl-samsung.h index 2b882320e8e9..5cedc9d26390 100644 --- a/drivers/pinctrl/samsung/pinctrl-samsung.h +++ b/drivers/pinctrl/samsung/pinctrl-samsung.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/gpio.h> | 26 | #include <linux/gpio.h> |
27 | 27 | ||
28 | /* pinmux function number for pin as gpio output line */ | 28 | /* pinmux function number for pin as gpio output line */ |
29 | #define FUNC_INPUT 0x0 | ||
29 | #define FUNC_OUTPUT 0x1 | 30 | #define FUNC_OUTPUT 0x1 |
30 | 31 | ||
31 | /** | 32 | /** |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c index 576d41b459e9..c6e5deba238e 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7791.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7791.c | |||
@@ -4509,24 +4509,24 @@ static const char * const audio_clk_groups[] = { | |||
4509 | }; | 4509 | }; |
4510 | 4510 | ||
4511 | static const char * const can0_groups[] = { | 4511 | static const char * const can0_groups[] = { |
4512 | "can0_data_a", | 4512 | "can0_data", |
4513 | "can0_data_b", | 4513 | "can0_data_b", |
4514 | "can0_data_c", | 4514 | "can0_data_c", |
4515 | "can0_data_d", | 4515 | "can0_data_d", |
4516 | "can0_data_e", | 4516 | "can0_data_e", |
4517 | "can0_data_f", | 4517 | "can0_data_f", |
4518 | "can_clk_a", | 4518 | "can_clk", |
4519 | "can_clk_b", | 4519 | "can_clk_b", |
4520 | "can_clk_c", | 4520 | "can_clk_c", |
4521 | "can_clk_d", | 4521 | "can_clk_d", |
4522 | }; | 4522 | }; |
4523 | 4523 | ||
4524 | static const char * const can1_groups[] = { | 4524 | static const char * const can1_groups[] = { |
4525 | "can1_data_a", | 4525 | "can1_data", |
4526 | "can1_data_b", | 4526 | "can1_data_b", |
4527 | "can1_data_c", | 4527 | "can1_data_c", |
4528 | "can1_data_d", | 4528 | "can1_data_d", |
4529 | "can_clk_a", | 4529 | "can_clk", |
4530 | "can_clk_b", | 4530 | "can_clk_b", |
4531 | "can_clk_c", | 4531 | "can_clk_c", |
4532 | "can_clk_d", | 4532 | "can_clk_d", |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 8f06250a0389..8754c33361e8 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -717,12 +717,14 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
717 | info->device_type = s5m87xx->device_type; | 717 | info->device_type = s5m87xx->device_type; |
718 | info->wtsr_smpl = s5m87xx->wtsr_smpl; | 718 | info->wtsr_smpl = s5m87xx->wtsr_smpl; |
719 | 719 | ||
720 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); | 720 | if (s5m87xx->irq_data) { |
721 | if (info->irq <= 0) { | 721 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); |
722 | ret = -EINVAL; | 722 | if (info->irq <= 0) { |
723 | dev_err(&pdev->dev, "Failed to get virtual IRQ %d\n", | 723 | ret = -EINVAL; |
724 | dev_err(&pdev->dev, "Failed to get virtual IRQ %d\n", | ||
724 | alarm_irq); | 725 | alarm_irq); |
725 | goto err; | 726 | goto err; |
727 | } | ||
726 | } | 728 | } |
727 | 729 | ||
728 | platform_set_drvdata(pdev, info); | 730 | platform_set_drvdata(pdev, info); |
@@ -744,6 +746,11 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
744 | goto err; | 746 | goto err; |
745 | } | 747 | } |
746 | 748 | ||
749 | if (!info->irq) { | ||
750 | dev_info(&pdev->dev, "Alarm IRQ not available\n"); | ||
751 | return 0; | ||
752 | } | ||
753 | |||
747 | ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, | 754 | ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, |
748 | s5m_rtc_alarm_irq, 0, "rtc-alarm0", | 755 | s5m_rtc_alarm_irq, 0, "rtc-alarm0", |
749 | info); | 756 | info); |
@@ -802,7 +809,7 @@ static int s5m_rtc_resume(struct device *dev) | |||
802 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 809 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
803 | int ret = 0; | 810 | int ret = 0; |
804 | 811 | ||
805 | if (device_may_wakeup(dev)) | 812 | if (info->irq && device_may_wakeup(dev)) |
806 | ret = disable_irq_wake(info->irq); | 813 | ret = disable_irq_wake(info->irq); |
807 | 814 | ||
808 | return ret; | 815 | return ret; |
@@ -813,7 +820,7 @@ static int s5m_rtc_suspend(struct device *dev) | |||
813 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | 820 | struct s5m_rtc_info *info = dev_get_drvdata(dev); |
814 | int ret = 0; | 821 | int ret = 0; |
815 | 822 | ||
816 | if (device_may_wakeup(dev)) | 823 | if (info->irq && device_may_wakeup(dev)) |
817 | ret = enable_irq_wake(info->irq); | 824 | ret = enable_irq_wake(info->irq); |
818 | 825 | ||
819 | return ret; | 826 | return ret; |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index a6d47e5eee9e..c43aca69fb30 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -1035,12 +1035,26 @@ static int tty3215_write(struct tty_struct * tty, | |||
1035 | const unsigned char *buf, int count) | 1035 | const unsigned char *buf, int count) |
1036 | { | 1036 | { |
1037 | struct raw3215_info *raw; | 1037 | struct raw3215_info *raw; |
1038 | int i, written; | ||
1038 | 1039 | ||
1039 | if (!tty) | 1040 | if (!tty) |
1040 | return 0; | 1041 | return 0; |
1041 | raw = (struct raw3215_info *) tty->driver_data; | 1042 | raw = (struct raw3215_info *) tty->driver_data; |
1042 | raw3215_write(raw, buf, count); | 1043 | written = count; |
1043 | return count; | 1044 | while (count > 0) { |
1045 | for (i = 0; i < count; i++) | ||
1046 | if (buf[i] == '\t' || buf[i] == '\n') | ||
1047 | break; | ||
1048 | raw3215_write(raw, buf, i); | ||
1049 | count -= i; | ||
1050 | buf += i; | ||
1051 | if (count > 0) { | ||
1052 | raw3215_putchar(raw, *buf); | ||
1053 | count--; | ||
1054 | buf++; | ||
1055 | } | ||
1056 | } | ||
1057 | return written; | ||
1044 | } | 1058 | } |
1045 | 1059 | ||
1046 | /* | 1060 | /* |
@@ -1188,7 +1202,7 @@ static int __init tty3215_init(void) | |||
1188 | driver->subtype = SYSTEM_TYPE_TTY; | 1202 | driver->subtype = SYSTEM_TYPE_TTY; |
1189 | driver->init_termios = tty_std_termios; | 1203 | driver->init_termios = tty_std_termios; |
1190 | driver->init_termios.c_iflag = IGNBRK | IGNPAR; | 1204 | driver->init_termios.c_iflag = IGNBRK | IGNPAR; |
1191 | driver->init_termios.c_oflag = ONLCR | XTABS; | 1205 | driver->init_termios.c_oflag = ONLCR; |
1192 | driver->init_termios.c_lflag = ISIG; | 1206 | driver->init_termios.c_lflag = ISIG; |
1193 | driver->flags = TTY_DRIVER_REAL_RAW; | 1207 | driver->flags = TTY_DRIVER_REAL_RAW; |
1194 | tty_set_operations(driver, &tty3215_ops); | 1208 | tty_set_operations(driver, &tty3215_ops); |
diff --git a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c index 7ed7a5987816..003663288e29 100644 --- a/drivers/s390/char/sclp_tty.c +++ b/drivers/s390/char/sclp_tty.c | |||
@@ -559,7 +559,7 @@ sclp_tty_init(void) | |||
559 | driver->subtype = SYSTEM_TYPE_TTY; | 559 | driver->subtype = SYSTEM_TYPE_TTY; |
560 | driver->init_termios = tty_std_termios; | 560 | driver->init_termios = tty_std_termios; |
561 | driver->init_termios.c_iflag = IGNBRK | IGNPAR; | 561 | driver->init_termios.c_iflag = IGNBRK | IGNPAR; |
562 | driver->init_termios.c_oflag = ONLCR | XTABS; | 562 | driver->init_termios.c_oflag = ONLCR; |
563 | driver->init_termios.c_lflag = ISIG | ECHO; | 563 | driver->init_termios.c_lflag = ISIG | ECHO; |
564 | driver->flags = TTY_DRIVER_REAL_RAW; | 564 | driver->flags = TTY_DRIVER_REAL_RAW; |
565 | tty_set_operations(driver, &sclp_ops); | 565 | tty_set_operations(driver, &sclp_ops); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ce62e8798cc8..d837dc180522 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1808,7 +1808,6 @@ static int scsi_mq_prep_fn(struct request *req) | |||
1808 | 1808 | ||
1809 | cmd->tag = req->tag; | 1809 | cmd->tag = req->tag; |
1810 | 1810 | ||
1811 | req->cmd = req->__cmd; | ||
1812 | cmd->cmnd = req->cmd; | 1811 | cmd->cmnd = req->cmd; |
1813 | cmd->prot_op = SCSI_PROT_NORMAL; | 1812 | cmd->prot_op = SCSI_PROT_NORMAL; |
1814 | 1813 | ||
diff --git a/drivers/spi/spi-au1550.c b/drivers/spi/spi-au1550.c index 40c3d43c9292..f40b34cdf2fc 100644 --- a/drivers/spi/spi-au1550.c +++ b/drivers/spi/spi-au1550.c | |||
@@ -945,7 +945,7 @@ static int au1550_spi_remove(struct platform_device *pdev) | |||
945 | spi_bitbang_stop(&hw->bitbang); | 945 | spi_bitbang_stop(&hw->bitbang); |
946 | free_irq(hw->irq, hw); | 946 | free_irq(hw->irq, hw); |
947 | iounmap((void __iomem *)hw->regs); | 947 | iounmap((void __iomem *)hw->regs); |
948 | release_mem_region(r->start, sizeof(psc_spi_t)); | 948 | release_mem_region(hw->ioarea->start, sizeof(psc_spi_t)); |
949 | 949 | ||
950 | if (hw->usedma) { | 950 | if (hw->usedma) { |
951 | au1550_spi_dma_rxtmp_free(hw); | 951 | au1550_spi_dma_rxtmp_free(hw); |
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index 276a3884fb3c..48f1d26e6ad9 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c | |||
@@ -417,16 +417,16 @@ static int davinci_spi_setup(struct spi_device *spi) | |||
417 | flags, dev_name(&spi->dev)); | 417 | flags, dev_name(&spi->dev)); |
418 | internal_cs = false; | 418 | internal_cs = false; |
419 | } | 419 | } |
420 | } | ||
421 | 420 | ||
422 | if (retval) { | 421 | if (retval) { |
423 | dev_err(&spi->dev, "GPIO %d setup failed (%d)\n", | 422 | dev_err(&spi->dev, "GPIO %d setup failed (%d)\n", |
424 | spi->cs_gpio, retval); | 423 | spi->cs_gpio, retval); |
425 | return retval; | 424 | return retval; |
426 | } | 425 | } |
427 | 426 | ||
428 | if (internal_cs) | 427 | if (internal_cs) |
429 | set_io_bits(dspi->base + SPIPC0, 1 << spi->chip_select); | 428 | set_io_bits(dspi->base + SPIPC0, 1 << spi->chip_select); |
429 | } | ||
430 | 430 | ||
431 | if (spi->mode & SPI_READY) | 431 | if (spi->mode & SPI_READY) |
432 | set_io_bits(dspi->base + SPIPC0, SPIPC0_SPIENA_MASK); | 432 | set_io_bits(dspi->base + SPIPC0, SPIPC0_SPIENA_MASK); |
diff --git a/drivers/spi/spi-dw-pci.c b/drivers/spi/spi-dw-pci.c index 3f3dc1226edf..e14960470d8d 100644 --- a/drivers/spi/spi-dw-pci.c +++ b/drivers/spi/spi-dw-pci.c | |||
@@ -62,6 +62,8 @@ static int spi_pci_probe(struct pci_dev *pdev, | |||
62 | if (ret) | 62 | if (ret) |
63 | return ret; | 63 | return ret; |
64 | 64 | ||
65 | dws->regs = pcim_iomap_table(pdev)[pci_bar]; | ||
66 | |||
65 | dws->bus_num = 0; | 67 | dws->bus_num = 0; |
66 | dws->num_cs = 4; | 68 | dws->num_cs = 4; |
67 | dws->irq = pdev->irq; | 69 | dws->irq = pdev->irq; |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 29f33143b795..670f0627f3bf 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -271,7 +271,7 @@ static void giveback(struct dw_spi *dws) | |||
271 | transfer_list); | 271 | transfer_list); |
272 | 272 | ||
273 | if (!last_transfer->cs_change) | 273 | if (!last_transfer->cs_change) |
274 | spi_chip_sel(dws, dws->cur_msg->spi, 0); | 274 | spi_chip_sel(dws, msg->spi, 0); |
275 | 275 | ||
276 | spi_finalize_current_message(dws->master); | 276 | spi_finalize_current_message(dws->master); |
277 | } | 277 | } |
diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index 68441fa448de..352eed7463ac 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c | |||
@@ -329,7 +329,8 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, | |||
329 | disable_fifo: | 329 | disable_fifo: |
330 | if (t->rx_buf != NULL) | 330 | if (t->rx_buf != NULL) |
331 | chconf &= ~OMAP2_MCSPI_CHCONF_FFER; | 331 | chconf &= ~OMAP2_MCSPI_CHCONF_FFER; |
332 | else | 332 | |
333 | if (t->tx_buf != NULL) | ||
333 | chconf &= ~OMAP2_MCSPI_CHCONF_FFET; | 334 | chconf &= ~OMAP2_MCSPI_CHCONF_FFET; |
334 | 335 | ||
335 | mcspi_write_chconf0(spi, chconf); | 336 | mcspi_write_chconf0(spi, chconf); |
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index fe792106bdc5..46f45ca2c694 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
@@ -1074,6 +1074,7 @@ static struct acpi_device_id pxa2xx_spi_acpi_match[] = { | |||
1074 | { "INT3430", 0 }, | 1074 | { "INT3430", 0 }, |
1075 | { "INT3431", 0 }, | 1075 | { "INT3431", 0 }, |
1076 | { "80860F0E", 0 }, | 1076 | { "80860F0E", 0 }, |
1077 | { "8086228E", 0 }, | ||
1077 | { }, | 1078 | { }, |
1078 | }; | 1079 | }; |
1079 | MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); | 1080 | MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match); |
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index c0743604b906..cd0e08b0c9f6 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c | |||
@@ -499,7 +499,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs) | |||
499 | } | 499 | } |
500 | 500 | ||
501 | /* div doesn't support odd number */ | 501 | /* div doesn't support odd number */ |
502 | div = rs->max_freq / rs->speed; | 502 | div = max_t(u32, rs->max_freq / rs->speed, 1); |
503 | div = (div + 1) & 0xfffe; | 503 | div = (div + 1) & 0xfffe; |
504 | 504 | ||
505 | spi_enable_chip(rs, 0); | 505 | spi_enable_chip(rs, 0); |
@@ -678,7 +678,7 @@ static int rockchip_spi_probe(struct platform_device *pdev) | |||
678 | rs->dma_tx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_TXDR); | 678 | rs->dma_tx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_TXDR); |
679 | rs->dma_rx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_RXDR); | 679 | rs->dma_rx.addr = (dma_addr_t)(mem->start + ROCKCHIP_SPI_RXDR); |
680 | rs->dma_tx.direction = DMA_MEM_TO_DEV; | 680 | rs->dma_tx.direction = DMA_MEM_TO_DEV; |
681 | rs->dma_tx.direction = DMA_DEV_TO_MEM; | 681 | rs->dma_rx.direction = DMA_DEV_TO_MEM; |
682 | 682 | ||
683 | master->can_dma = rockchip_spi_can_dma; | 683 | master->can_dma = rockchip_spi_can_dma; |
684 | master->dma_tx = rs->dma_tx.ch; | 684 | master->dma_tx = rs->dma_tx.ch; |
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index c850dfdfa9e3..ad87a98f8f68 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -472,25 +472,52 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
472 | dma_cookie_t cookie; | 472 | dma_cookie_t cookie; |
473 | int ret; | 473 | int ret; |
474 | 474 | ||
475 | if (tx) { | 475 | /* First prepare and submit the DMA request(s), as this may fail */ |
476 | desc_tx = dmaengine_prep_slave_sg(rspi->master->dma_tx, | ||
477 | tx->sgl, tx->nents, DMA_TO_DEVICE, | ||
478 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
479 | if (!desc_tx) | ||
480 | goto no_dma; | ||
481 | |||
482 | irq_mask |= SPCR_SPTIE; | ||
483 | } | ||
484 | if (rx) { | 476 | if (rx) { |
485 | desc_rx = dmaengine_prep_slave_sg(rspi->master->dma_rx, | 477 | desc_rx = dmaengine_prep_slave_sg(rspi->master->dma_rx, |
486 | rx->sgl, rx->nents, DMA_FROM_DEVICE, | 478 | rx->sgl, rx->nents, DMA_FROM_DEVICE, |
487 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 479 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
488 | if (!desc_rx) | 480 | if (!desc_rx) { |
489 | goto no_dma; | 481 | ret = -EAGAIN; |
482 | goto no_dma_rx; | ||
483 | } | ||
484 | |||
485 | desc_rx->callback = rspi_dma_complete; | ||
486 | desc_rx->callback_param = rspi; | ||
487 | cookie = dmaengine_submit(desc_rx); | ||
488 | if (dma_submit_error(cookie)) { | ||
489 | ret = cookie; | ||
490 | goto no_dma_rx; | ||
491 | } | ||
490 | 492 | ||
491 | irq_mask |= SPCR_SPRIE; | 493 | irq_mask |= SPCR_SPRIE; |
492 | } | 494 | } |
493 | 495 | ||
496 | if (tx) { | ||
497 | desc_tx = dmaengine_prep_slave_sg(rspi->master->dma_tx, | ||
498 | tx->sgl, tx->nents, DMA_TO_DEVICE, | ||
499 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
500 | if (!desc_tx) { | ||
501 | ret = -EAGAIN; | ||
502 | goto no_dma_tx; | ||
503 | } | ||
504 | |||
505 | if (rx) { | ||
506 | /* No callback */ | ||
507 | desc_tx->callback = NULL; | ||
508 | } else { | ||
509 | desc_tx->callback = rspi_dma_complete; | ||
510 | desc_tx->callback_param = rspi; | ||
511 | } | ||
512 | cookie = dmaengine_submit(desc_tx); | ||
513 | if (dma_submit_error(cookie)) { | ||
514 | ret = cookie; | ||
515 | goto no_dma_tx; | ||
516 | } | ||
517 | |||
518 | irq_mask |= SPCR_SPTIE; | ||
519 | } | ||
520 | |||
494 | /* | 521 | /* |
495 | * DMAC needs SPxIE, but if SPxIE is set, the IRQ routine will be | 522 | * DMAC needs SPxIE, but if SPxIE is set, the IRQ routine will be |
496 | * called. So, this driver disables the IRQ while DMA transfer. | 523 | * called. So, this driver disables the IRQ while DMA transfer. |
@@ -503,34 +530,24 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
503 | rspi_enable_irq(rspi, irq_mask); | 530 | rspi_enable_irq(rspi, irq_mask); |
504 | rspi->dma_callbacked = 0; | 531 | rspi->dma_callbacked = 0; |
505 | 532 | ||
506 | if (rx) { | 533 | /* Now start DMA */ |
507 | desc_rx->callback = rspi_dma_complete; | 534 | if (rx) |
508 | desc_rx->callback_param = rspi; | ||
509 | cookie = dmaengine_submit(desc_rx); | ||
510 | if (dma_submit_error(cookie)) | ||
511 | return cookie; | ||
512 | dma_async_issue_pending(rspi->master->dma_rx); | 535 | dma_async_issue_pending(rspi->master->dma_rx); |
513 | } | 536 | if (tx) |
514 | if (tx) { | ||
515 | if (rx) { | ||
516 | /* No callback */ | ||
517 | desc_tx->callback = NULL; | ||
518 | } else { | ||
519 | desc_tx->callback = rspi_dma_complete; | ||
520 | desc_tx->callback_param = rspi; | ||
521 | } | ||
522 | cookie = dmaengine_submit(desc_tx); | ||
523 | if (dma_submit_error(cookie)) | ||
524 | return cookie; | ||
525 | dma_async_issue_pending(rspi->master->dma_tx); | 537 | dma_async_issue_pending(rspi->master->dma_tx); |
526 | } | ||
527 | 538 | ||
528 | ret = wait_event_interruptible_timeout(rspi->wait, | 539 | ret = wait_event_interruptible_timeout(rspi->wait, |
529 | rspi->dma_callbacked, HZ); | 540 | rspi->dma_callbacked, HZ); |
530 | if (ret > 0 && rspi->dma_callbacked) | 541 | if (ret > 0 && rspi->dma_callbacked) |
531 | ret = 0; | 542 | ret = 0; |
532 | else if (!ret) | 543 | else if (!ret) { |
544 | dev_err(&rspi->master->dev, "DMA timeout\n"); | ||
533 | ret = -ETIMEDOUT; | 545 | ret = -ETIMEDOUT; |
546 | if (tx) | ||
547 | dmaengine_terminate_all(rspi->master->dma_tx); | ||
548 | if (rx) | ||
549 | dmaengine_terminate_all(rspi->master->dma_rx); | ||
550 | } | ||
534 | 551 | ||
535 | rspi_disable_irq(rspi, irq_mask); | 552 | rspi_disable_irq(rspi, irq_mask); |
536 | 553 | ||
@@ -541,11 +558,16 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx, | |||
541 | 558 | ||
542 | return ret; | 559 | return ret; |
543 | 560 | ||
544 | no_dma: | 561 | no_dma_tx: |
545 | pr_warn_once("%s %s: DMA not available, falling back to PIO\n", | 562 | if (rx) |
546 | dev_driver_string(&rspi->master->dev), | 563 | dmaengine_terminate_all(rspi->master->dma_rx); |
547 | dev_name(&rspi->master->dev)); | 564 | no_dma_rx: |
548 | return -EAGAIN; | 565 | if (ret == -EAGAIN) { |
566 | pr_warn_once("%s %s: DMA not available, falling back to PIO\n", | ||
567 | dev_driver_string(&rspi->master->dev), | ||
568 | dev_name(&rspi->master->dev)); | ||
569 | } | ||
570 | return ret; | ||
549 | } | 571 | } |
550 | 572 | ||
551 | static void rspi_receive_init(const struct rspi_data *rspi) | 573 | static void rspi_receive_init(const struct rspi_data *rspi) |
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 2a4354dcd661..543075b80f16 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c | |||
@@ -636,48 +636,38 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx, | |||
636 | dma_cookie_t cookie; | 636 | dma_cookie_t cookie; |
637 | int ret; | 637 | int ret; |
638 | 638 | ||
639 | if (tx) { | 639 | /* First prepare and submit the DMA request(s), as this may fail */ |
640 | ier_bits |= IER_TDREQE | IER_TDMAE; | ||
641 | dma_sync_single_for_device(p->master->dma_tx->device->dev, | ||
642 | p->tx_dma_addr, len, DMA_TO_DEVICE); | ||
643 | desc_tx = dmaengine_prep_slave_single(p->master->dma_tx, | ||
644 | p->tx_dma_addr, len, DMA_TO_DEVICE, | ||
645 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
646 | if (!desc_tx) | ||
647 | return -EAGAIN; | ||
648 | } | ||
649 | |||
650 | if (rx) { | 640 | if (rx) { |
651 | ier_bits |= IER_RDREQE | IER_RDMAE; | 641 | ier_bits |= IER_RDREQE | IER_RDMAE; |
652 | desc_rx = dmaengine_prep_slave_single(p->master->dma_rx, | 642 | desc_rx = dmaengine_prep_slave_single(p->master->dma_rx, |
653 | p->rx_dma_addr, len, DMA_FROM_DEVICE, | 643 | p->rx_dma_addr, len, DMA_FROM_DEVICE, |
654 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | 644 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
655 | if (!desc_rx) | 645 | if (!desc_rx) { |
656 | return -EAGAIN; | 646 | ret = -EAGAIN; |
657 | } | 647 | goto no_dma_rx; |
658 | 648 | } | |
659 | /* 1 stage FIFO watermarks for DMA */ | ||
660 | sh_msiof_write(p, FCTR, FCTR_TFWM_1 | FCTR_RFWM_1); | ||
661 | |||
662 | /* setup msiof transfer mode registers (32-bit words) */ | ||
663 | sh_msiof_spi_set_mode_regs(p, tx, rx, 32, len / 4); | ||
664 | |||
665 | sh_msiof_write(p, IER, ier_bits); | ||
666 | |||
667 | reinit_completion(&p->done); | ||
668 | 649 | ||
669 | if (rx) { | ||
670 | desc_rx->callback = sh_msiof_dma_complete; | 650 | desc_rx->callback = sh_msiof_dma_complete; |
671 | desc_rx->callback_param = p; | 651 | desc_rx->callback_param = p; |
672 | cookie = dmaengine_submit(desc_rx); | 652 | cookie = dmaengine_submit(desc_rx); |
673 | if (dma_submit_error(cookie)) { | 653 | if (dma_submit_error(cookie)) { |
674 | ret = cookie; | 654 | ret = cookie; |
675 | goto stop_ier; | 655 | goto no_dma_rx; |
676 | } | 656 | } |
677 | dma_async_issue_pending(p->master->dma_rx); | ||
678 | } | 657 | } |
679 | 658 | ||
680 | if (tx) { | 659 | if (tx) { |
660 | ier_bits |= IER_TDREQE | IER_TDMAE; | ||
661 | dma_sync_single_for_device(p->master->dma_tx->device->dev, | ||
662 | p->tx_dma_addr, len, DMA_TO_DEVICE); | ||
663 | desc_tx = dmaengine_prep_slave_single(p->master->dma_tx, | ||
664 | p->tx_dma_addr, len, DMA_TO_DEVICE, | ||
665 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
666 | if (!desc_tx) { | ||
667 | ret = -EAGAIN; | ||
668 | goto no_dma_tx; | ||
669 | } | ||
670 | |||
681 | if (rx) { | 671 | if (rx) { |
682 | /* No callback */ | 672 | /* No callback */ |
683 | desc_tx->callback = NULL; | 673 | desc_tx->callback = NULL; |
@@ -688,15 +678,30 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx, | |||
688 | cookie = dmaengine_submit(desc_tx); | 678 | cookie = dmaengine_submit(desc_tx); |
689 | if (dma_submit_error(cookie)) { | 679 | if (dma_submit_error(cookie)) { |
690 | ret = cookie; | 680 | ret = cookie; |
691 | goto stop_rx; | 681 | goto no_dma_tx; |
692 | } | 682 | } |
693 | dma_async_issue_pending(p->master->dma_tx); | ||
694 | } | 683 | } |
695 | 684 | ||
685 | /* 1 stage FIFO watermarks for DMA */ | ||
686 | sh_msiof_write(p, FCTR, FCTR_TFWM_1 | FCTR_RFWM_1); | ||
687 | |||
688 | /* setup msiof transfer mode registers (32-bit words) */ | ||
689 | sh_msiof_spi_set_mode_regs(p, tx, rx, 32, len / 4); | ||
690 | |||
691 | sh_msiof_write(p, IER, ier_bits); | ||
692 | |||
693 | reinit_completion(&p->done); | ||
694 | |||
695 | /* Now start DMA */ | ||
696 | if (rx) | ||
697 | dma_async_issue_pending(p->master->dma_rx); | ||
698 | if (tx) | ||
699 | dma_async_issue_pending(p->master->dma_tx); | ||
700 | |||
696 | ret = sh_msiof_spi_start(p, rx); | 701 | ret = sh_msiof_spi_start(p, rx); |
697 | if (ret) { | 702 | if (ret) { |
698 | dev_err(&p->pdev->dev, "failed to start hardware\n"); | 703 | dev_err(&p->pdev->dev, "failed to start hardware\n"); |
699 | goto stop_tx; | 704 | goto stop_dma; |
700 | } | 705 | } |
701 | 706 | ||
702 | /* wait for tx fifo to be emptied / rx fifo to be filled */ | 707 | /* wait for tx fifo to be emptied / rx fifo to be filled */ |
@@ -726,14 +731,14 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx, | |||
726 | stop_reset: | 731 | stop_reset: |
727 | sh_msiof_reset_str(p); | 732 | sh_msiof_reset_str(p); |
728 | sh_msiof_spi_stop(p, rx); | 733 | sh_msiof_spi_stop(p, rx); |
729 | stop_tx: | 734 | stop_dma: |
730 | if (tx) | 735 | if (tx) |
731 | dmaengine_terminate_all(p->master->dma_tx); | 736 | dmaengine_terminate_all(p->master->dma_tx); |
732 | stop_rx: | 737 | no_dma_tx: |
733 | if (rx) | 738 | if (rx) |
734 | dmaengine_terminate_all(p->master->dma_rx); | 739 | dmaengine_terminate_all(p->master->dma_rx); |
735 | stop_ier: | ||
736 | sh_msiof_write(p, IER, 0); | 740 | sh_msiof_write(p, IER, 0); |
741 | no_dma_rx: | ||
737 | return ret; | 742 | return ret; |
738 | } | 743 | } |
739 | 744 | ||
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index e0531baf2782..ca935df80c88 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -848,6 +848,7 @@ out: | |||
848 | 848 | ||
849 | /** | 849 | /** |
850 | * spi_finalize_current_transfer - report completion of a transfer | 850 | * spi_finalize_current_transfer - report completion of a transfer |
851 | * @master: the master reporting completion | ||
851 | * | 852 | * |
852 | * Called by SPI drivers using the core transfer_one_message() | 853 | * Called by SPI drivers using the core transfer_one_message() |
853 | * implementation to notify it that the current interrupt driven | 854 | * implementation to notify it that the current interrupt driven |
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 2c486ea6236b..35b494f5667f 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig | |||
@@ -28,8 +28,6 @@ source "drivers/staging/et131x/Kconfig" | |||
28 | 28 | ||
29 | source "drivers/staging/slicoss/Kconfig" | 29 | source "drivers/staging/slicoss/Kconfig" |
30 | 30 | ||
31 | source "drivers/staging/usbip/Kconfig" | ||
32 | |||
33 | source "drivers/staging/wlan-ng/Kconfig" | 31 | source "drivers/staging/wlan-ng/Kconfig" |
34 | 32 | ||
35 | source "drivers/staging/comedi/Kconfig" | 33 | source "drivers/staging/comedi/Kconfig" |
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 1e1a3a10faf7..e66a5dbd9b02 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile | |||
@@ -6,7 +6,6 @@ obj-$(CONFIG_STAGING) += staging.o | |||
6 | obj-y += media/ | 6 | obj-y += media/ |
7 | obj-$(CONFIG_ET131X) += et131x/ | 7 | obj-$(CONFIG_ET131X) += et131x/ |
8 | obj-$(CONFIG_SLICOSS) += slicoss/ | 8 | obj-$(CONFIG_SLICOSS) += slicoss/ |
9 | obj-$(CONFIG_USBIP_CORE) += usbip/ | ||
10 | obj-$(CONFIG_PRISM2_USB) += wlan-ng/ | 9 | obj-$(CONFIG_PRISM2_USB) += wlan-ng/ |
11 | obj-$(CONFIG_COMEDI) += comedi/ | 10 | obj-$(CONFIG_COMEDI) += comedi/ |
12 | obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/ | 11 | obj-$(CONFIG_FB_OLPC_DCON) += olpc_dcon/ |
diff --git a/drivers/staging/android/logger.c b/drivers/staging/android/logger.c index 9b47e66599a3..0bf0d24d12d5 100644 --- a/drivers/staging/android/logger.c +++ b/drivers/staging/android/logger.c | |||
@@ -790,7 +790,7 @@ static int __init create_log(char *log_name, int size) | |||
790 | if (unlikely(ret)) { | 790 | if (unlikely(ret)) { |
791 | pr_err("failed to register misc device for log '%s'!\n", | 791 | pr_err("failed to register misc device for log '%s'!\n", |
792 | log->misc.name); | 792 | log->misc.name); |
793 | goto out_free_log; | 793 | goto out_free_misc_name; |
794 | } | 794 | } |
795 | 795 | ||
796 | pr_info("created %luK log '%s'\n", | 796 | pr_info("created %luK log '%s'\n", |
@@ -798,6 +798,9 @@ static int __init create_log(char *log_name, int size) | |||
798 | 798 | ||
799 | return 0; | 799 | return 0; |
800 | 800 | ||
801 | out_free_misc_name: | ||
802 | kfree(log->misc.name); | ||
803 | |||
801 | out_free_log: | 804 | out_free_log: |
802 | kfree(log); | 805 | kfree(log); |
803 | 806 | ||
diff --git a/drivers/staging/et131x/et131x.c b/drivers/staging/et131x/et131x.c index 8bf1eb485163..831b7c6fe494 100644 --- a/drivers/staging/et131x/et131x.c +++ b/drivers/staging/et131x/et131x.c | |||
@@ -1421,22 +1421,16 @@ static int et131x_mii_read(struct et131x_adapter *adapter, u8 reg, u16 *value) | |||
1421 | * @reg: the register to read | 1421 | * @reg: the register to read |
1422 | * @value: 16-bit value to write | 1422 | * @value: 16-bit value to write |
1423 | */ | 1423 | */ |
1424 | static int et131x_mii_write(struct et131x_adapter *adapter, u8 reg, u16 value) | 1424 | static int et131x_mii_write(struct et131x_adapter *adapter, u8 addr, u8 reg, |
1425 | u16 value) | ||
1425 | { | 1426 | { |
1426 | struct mac_regs __iomem *mac = &adapter->regs->mac; | 1427 | struct mac_regs __iomem *mac = &adapter->regs->mac; |
1427 | struct phy_device *phydev = adapter->phydev; | ||
1428 | int status = 0; | 1428 | int status = 0; |
1429 | u8 addr; | ||
1430 | u32 delay = 0; | 1429 | u32 delay = 0; |
1431 | u32 mii_addr; | 1430 | u32 mii_addr; |
1432 | u32 mii_cmd; | 1431 | u32 mii_cmd; |
1433 | u32 mii_indicator; | 1432 | u32 mii_indicator; |
1434 | 1433 | ||
1435 | if (!phydev) | ||
1436 | return -EIO; | ||
1437 | |||
1438 | addr = phydev->addr; | ||
1439 | |||
1440 | /* Save a local copy of the registers we are dealing with so we can | 1434 | /* Save a local copy of the registers we are dealing with so we can |
1441 | * set them back | 1435 | * set them back |
1442 | */ | 1436 | */ |
@@ -1631,17 +1625,7 @@ static int et131x_mdio_write(struct mii_bus *bus, int phy_addr, | |||
1631 | struct net_device *netdev = bus->priv; | 1625 | struct net_device *netdev = bus->priv; |
1632 | struct et131x_adapter *adapter = netdev_priv(netdev); | 1626 | struct et131x_adapter *adapter = netdev_priv(netdev); |
1633 | 1627 | ||
1634 | return et131x_mii_write(adapter, reg, value); | 1628 | return et131x_mii_write(adapter, phy_addr, reg, value); |
1635 | } | ||
1636 | |||
1637 | static int et131x_mdio_reset(struct mii_bus *bus) | ||
1638 | { | ||
1639 | struct net_device *netdev = bus->priv; | ||
1640 | struct et131x_adapter *adapter = netdev_priv(netdev); | ||
1641 | |||
1642 | et131x_mii_write(adapter, MII_BMCR, BMCR_RESET); | ||
1643 | |||
1644 | return 0; | ||
1645 | } | 1629 | } |
1646 | 1630 | ||
1647 | /* et1310_phy_power_switch - PHY power control | 1631 | /* et1310_phy_power_switch - PHY power control |
@@ -1656,18 +1640,20 @@ static int et131x_mdio_reset(struct mii_bus *bus) | |||
1656 | static void et1310_phy_power_switch(struct et131x_adapter *adapter, bool down) | 1640 | static void et1310_phy_power_switch(struct et131x_adapter *adapter, bool down) |
1657 | { | 1641 | { |
1658 | u16 data; | 1642 | u16 data; |
1643 | struct phy_device *phydev = adapter->phydev; | ||
1659 | 1644 | ||
1660 | et131x_mii_read(adapter, MII_BMCR, &data); | 1645 | et131x_mii_read(adapter, MII_BMCR, &data); |
1661 | data &= ~BMCR_PDOWN; | 1646 | data &= ~BMCR_PDOWN; |
1662 | if (down) | 1647 | if (down) |
1663 | data |= BMCR_PDOWN; | 1648 | data |= BMCR_PDOWN; |
1664 | et131x_mii_write(adapter, MII_BMCR, data); | 1649 | et131x_mii_write(adapter, phydev->addr, MII_BMCR, data); |
1665 | } | 1650 | } |
1666 | 1651 | ||
1667 | /* et131x_xcvr_init - Init the phy if we are setting it into force mode */ | 1652 | /* et131x_xcvr_init - Init the phy if we are setting it into force mode */ |
1668 | static void et131x_xcvr_init(struct et131x_adapter *adapter) | 1653 | static void et131x_xcvr_init(struct et131x_adapter *adapter) |
1669 | { | 1654 | { |
1670 | u16 lcr2; | 1655 | u16 lcr2; |
1656 | struct phy_device *phydev = adapter->phydev; | ||
1671 | 1657 | ||
1672 | /* Set the LED behavior such that LED 1 indicates speed (off = | 1658 | /* Set the LED behavior such that LED 1 indicates speed (off = |
1673 | * 10Mbits, blink = 100Mbits, on = 1000Mbits) and LED 2 indicates | 1659 | * 10Mbits, blink = 100Mbits, on = 1000Mbits) and LED 2 indicates |
@@ -1688,7 +1674,7 @@ static void et131x_xcvr_init(struct et131x_adapter *adapter) | |||
1688 | else | 1674 | else |
1689 | lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); | 1675 | lcr2 |= (LED_VAL_LINKON << LED_TXRX_SHIFT); |
1690 | 1676 | ||
1691 | et131x_mii_write(adapter, PHY_LED_2, lcr2); | 1677 | et131x_mii_write(adapter, phydev->addr, PHY_LED_2, lcr2); |
1692 | } | 1678 | } |
1693 | } | 1679 | } |
1694 | 1680 | ||
@@ -3643,14 +3629,14 @@ static void et131x_adjust_link(struct net_device *netdev) | |||
3643 | 3629 | ||
3644 | et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | 3630 | et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, |
3645 | ®ister18); | 3631 | ®ister18); |
3646 | et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, | 3632 | et131x_mii_write(adapter, phydev->addr, |
3647 | register18 | 0x4); | 3633 | PHY_MPHY_CONTROL_REG, register18 | 0x4); |
3648 | et131x_mii_write(adapter, PHY_INDEX_REG, | 3634 | et131x_mii_write(adapter, phydev->addr, PHY_INDEX_REG, |
3649 | register18 | 0x8402); | 3635 | register18 | 0x8402); |
3650 | et131x_mii_write(adapter, PHY_DATA_REG, | 3636 | et131x_mii_write(adapter, phydev->addr, PHY_DATA_REG, |
3651 | register18 | 511); | 3637 | register18 | 511); |
3652 | et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, | 3638 | et131x_mii_write(adapter, phydev->addr, |
3653 | register18); | 3639 | PHY_MPHY_CONTROL_REG, register18); |
3654 | } | 3640 | } |
3655 | 3641 | ||
3656 | et1310_config_flow_control(adapter); | 3642 | et1310_config_flow_control(adapter); |
@@ -3662,7 +3648,8 @@ static void et131x_adjust_link(struct net_device *netdev) | |||
3662 | et131x_mii_read(adapter, PHY_CONFIG, ®); | 3648 | et131x_mii_read(adapter, PHY_CONFIG, ®); |
3663 | reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; | 3649 | reg &= ~ET_PHY_CONFIG_TX_FIFO_DEPTH; |
3664 | reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; | 3650 | reg |= ET_PHY_CONFIG_FIFO_DEPTH_32; |
3665 | et131x_mii_write(adapter, PHY_CONFIG, reg); | 3651 | et131x_mii_write(adapter, phydev->addr, PHY_CONFIG, |
3652 | reg); | ||
3666 | } | 3653 | } |
3667 | 3654 | ||
3668 | et131x_set_rx_dma_timer(adapter); | 3655 | et131x_set_rx_dma_timer(adapter); |
@@ -3675,14 +3662,14 @@ static void et131x_adjust_link(struct net_device *netdev) | |||
3675 | 3662 | ||
3676 | et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, | 3663 | et131x_mii_read(adapter, PHY_MPHY_CONTROL_REG, |
3677 | ®ister18); | 3664 | ®ister18); |
3678 | et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, | 3665 | et131x_mii_write(adapter, phydev->addr, |
3679 | register18 | 0x4); | 3666 | PHY_MPHY_CONTROL_REG, register18 | 0x4); |
3680 | et131x_mii_write(adapter, PHY_INDEX_REG, | 3667 | et131x_mii_write(adapter, phydev->addr, |
3681 | register18 | 0x8402); | 3668 | PHY_INDEX_REG, register18 | 0x8402); |
3682 | et131x_mii_write(adapter, PHY_DATA_REG, | 3669 | et131x_mii_write(adapter, phydev->addr, |
3683 | register18 | 511); | 3670 | PHY_DATA_REG, register18 | 511); |
3684 | et131x_mii_write(adapter, PHY_MPHY_CONTROL_REG, | 3671 | et131x_mii_write(adapter, phydev->addr, |
3685 | register18); | 3672 | PHY_MPHY_CONTROL_REG, register18); |
3686 | } | 3673 | } |
3687 | 3674 | ||
3688 | /* Free the packets being actively sent & stopped */ | 3675 | /* Free the packets being actively sent & stopped */ |
@@ -4644,10 +4631,6 @@ static int et131x_pci_setup(struct pci_dev *pdev, | |||
4644 | /* Copy address into the net_device struct */ | 4631 | /* Copy address into the net_device struct */ |
4645 | memcpy(netdev->dev_addr, adapter->addr, ETH_ALEN); | 4632 | memcpy(netdev->dev_addr, adapter->addr, ETH_ALEN); |
4646 | 4633 | ||
4647 | /* Init variable for counting how long we do not have link status */ | ||
4648 | adapter->boot_coma = 0; | ||
4649 | et1310_disable_phy_coma(adapter); | ||
4650 | |||
4651 | rc = -ENOMEM; | 4634 | rc = -ENOMEM; |
4652 | 4635 | ||
4653 | /* Setup the mii_bus struct */ | 4636 | /* Setup the mii_bus struct */ |
@@ -4663,7 +4646,6 @@ static int et131x_pci_setup(struct pci_dev *pdev, | |||
4663 | adapter->mii_bus->priv = netdev; | 4646 | adapter->mii_bus->priv = netdev; |
4664 | adapter->mii_bus->read = et131x_mdio_read; | 4647 | adapter->mii_bus->read = et131x_mdio_read; |
4665 | adapter->mii_bus->write = et131x_mdio_write; | 4648 | adapter->mii_bus->write = et131x_mdio_write; |
4666 | adapter->mii_bus->reset = et131x_mdio_reset; | ||
4667 | adapter->mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), | 4649 | adapter->mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), |
4668 | GFP_KERNEL); | 4650 | GFP_KERNEL); |
4669 | if (!adapter->mii_bus->irq) | 4651 | if (!adapter->mii_bus->irq) |
@@ -4687,6 +4669,10 @@ static int et131x_pci_setup(struct pci_dev *pdev, | |||
4687 | /* Setup et1310 as per the documentation */ | 4669 | /* Setup et1310 as per the documentation */ |
4688 | et131x_adapter_setup(adapter); | 4670 | et131x_adapter_setup(adapter); |
4689 | 4671 | ||
4672 | /* Init variable for counting how long we do not have link status */ | ||
4673 | adapter->boot_coma = 0; | ||
4674 | et1310_disable_phy_coma(adapter); | ||
4675 | |||
4690 | /* We can enable interrupts now | 4676 | /* We can enable interrupts now |
4691 | * | 4677 | * |
4692 | * NOTE - Because registration of interrupt handler is done in the | 4678 | * NOTE - Because registration of interrupt handler is done in the |
diff --git a/drivers/staging/lustre/lustre/libcfs/workitem.c b/drivers/staging/lustre/lustre/libcfs/workitem.c index 65629579bd7d..03ab9e046784 100644 --- a/drivers/staging/lustre/lustre/libcfs/workitem.c +++ b/drivers/staging/lustre/lustre/libcfs/workitem.c | |||
@@ -365,6 +365,7 @@ cfs_wi_sched_create(char *name, struct cfs_cpt_table *cptab, | |||
365 | return -ENOMEM; | 365 | return -ENOMEM; |
366 | 366 | ||
367 | strncpy(sched->ws_name, name, CFS_WS_NAME_LEN); | 367 | strncpy(sched->ws_name, name, CFS_WS_NAME_LEN); |
368 | sched->ws_name[CFS_WS_NAME_LEN - 1] = '\0'; | ||
368 | sched->ws_cptab = cptab; | 369 | sched->ws_cptab = cptab; |
369 | sched->ws_cpt = cpt; | 370 | sched->ws_cpt = cpt; |
370 | 371 | ||
diff --git a/drivers/staging/lustre/lustre/obdclass/class_obd.c b/drivers/staging/lustre/lustre/obdclass/class_obd.c index 8b19f3caa68f..701c6a776524 100644 --- a/drivers/staging/lustre/lustre/obdclass/class_obd.c +++ b/drivers/staging/lustre/lustre/obdclass/class_obd.c | |||
@@ -35,7 +35,7 @@ | |||
35 | */ | 35 | */ |
36 | 36 | ||
37 | #define DEBUG_SUBSYSTEM S_CLASS | 37 | #define DEBUG_SUBSYSTEM S_CLASS |
38 | # include <asm/atomic.h> | 38 | # include <linux/atomic.h> |
39 | 39 | ||
40 | #include "../include/obd_support.h" | 40 | #include "../include/obd_support.h" |
41 | #include "../include/obd_class.h" | 41 | #include "../include/obd_class.h" |
diff --git a/drivers/staging/rtl8188eu/os_dep/usb_intf.c b/drivers/staging/rtl8188eu/os_dep/usb_intf.c index b8676ac77b0c..407a318b09db 100644 --- a/drivers/staging/rtl8188eu/os_dep/usb_intf.c +++ b/drivers/staging/rtl8188eu/os_dep/usb_intf.c | |||
@@ -43,9 +43,11 @@ static struct usb_device_id rtw_usb_id_tbl[] = { | |||
43 | {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */ | 43 | {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */ |
44 | /*=== Customer ID ===*/ | 44 | /*=== Customer ID ===*/ |
45 | /****** 8188EUS ********/ | 45 | /****** 8188EUS ********/ |
46 | {USB_DEVICE(0x056e, 0x4008)}, /* Elecom WDC-150SU2M */ | ||
46 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ | 47 | {USB_DEVICE(0x07b8, 0x8179)}, /* Abocom - Abocom */ |
47 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ | 48 | {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */ |
48 | {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ | 49 | {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */ |
50 | {USB_DEVICE(0x0df6, 0x0076)}, /* Sitecom N150 v2 */ | ||
49 | {} /* Terminating entry */ | 51 | {} /* Terminating entry */ |
50 | }; | 52 | }; |
51 | 53 | ||
diff --git a/drivers/staging/usbip/uapi/usbip.h b/drivers/staging/usbip/uapi/usbip.h deleted file mode 100644 index fa5db30ede36..000000000000 --- a/drivers/staging/usbip/uapi/usbip.h +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | /* | ||
2 | * usbip.h | ||
3 | * | ||
4 | * USBIP uapi defines and function prototypes etc. | ||
5 | */ | ||
6 | |||
7 | #ifndef _UAPI_LINUX_USBIP_H | ||
8 | #define _UAPI_LINUX_USBIP_H | ||
9 | |||
10 | /* usbip device status - exported in usbip device sysfs status */ | ||
11 | enum usbip_device_status { | ||
12 | /* sdev is available. */ | ||
13 | SDEV_ST_AVAILABLE = 0x01, | ||
14 | /* sdev is now used. */ | ||
15 | SDEV_ST_USED, | ||
16 | /* sdev is unusable because of a fatal error. */ | ||
17 | SDEV_ST_ERROR, | ||
18 | |||
19 | /* vdev does not connect a remote device. */ | ||
20 | VDEV_ST_NULL, | ||
21 | /* vdev is used, but the USB address is not assigned yet */ | ||
22 | VDEV_ST_NOTASSIGNED, | ||
23 | VDEV_ST_USED, | ||
24 | VDEV_ST_ERROR | ||
25 | }; | ||
26 | #endif /* _UAPI_LINUX_USBIP_H */ | ||
diff --git a/drivers/staging/usbip/userspace/.gitignore b/drivers/staging/usbip/userspace/.gitignore deleted file mode 100644 index 9aad9e30a8ba..000000000000 --- a/drivers/staging/usbip/userspace/.gitignore +++ /dev/null | |||
@@ -1,28 +0,0 @@ | |||
1 | Makefile | ||
2 | Makefile.in | ||
3 | aclocal.m4 | ||
4 | autom4te.cache/ | ||
5 | config.guess | ||
6 | config.h | ||
7 | config.h.in | ||
8 | config.log | ||
9 | config.status | ||
10 | config.sub | ||
11 | configure | ||
12 | depcomp | ||
13 | install-sh | ||
14 | libsrc/Makefile | ||
15 | libsrc/Makefile.in | ||
16 | libtool | ||
17 | ltmain.sh | ||
18 | missing | ||
19 | src/Makefile | ||
20 | src/Makefile.in | ||
21 | stamp-h1 | ||
22 | libsrc/libusbip.la | ||
23 | libsrc/libusbip_la-names.lo | ||
24 | libsrc/libusbip_la-usbip_common.lo | ||
25 | libsrc/libusbip_la-usbip_host_driver.lo | ||
26 | libsrc/libusbip_la-vhci_driver.lo | ||
27 | src/usbip | ||
28 | src/usbipd | ||
diff --git a/drivers/staging/usbip/userspace/AUTHORS b/drivers/staging/usbip/userspace/AUTHORS deleted file mode 100644 index a27ea8d03aec..000000000000 --- a/drivers/staging/usbip/userspace/AUTHORS +++ /dev/null | |||
@@ -1,3 +0,0 @@ | |||
1 | Takahiro Hirofuchi | ||
2 | Robert Leibl | ||
3 | matt mooney <mfm@muteddisk.com> | ||
diff --git a/drivers/staging/usbip/userspace/COPYING b/drivers/staging/usbip/userspace/COPYING deleted file mode 100644 index c5611e48a8e1..000000000000 --- a/drivers/staging/usbip/userspace/COPYING +++ /dev/null | |||
@@ -1,340 +0,0 @@ | |||
1 | GNU GENERAL PUBLIC LICENSE | ||
2 | Version 2, June 1991 | ||
3 | |||
4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||
5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
6 | Everyone is permitted to copy and distribute verbatim copies | ||
7 | of this license document, but changing it is not allowed. | ||
8 | |||
9 | Preamble | ||
10 | |||
11 | The licenses for most software are designed to take away your | ||
12 | freedom to share and change it. By contrast, the GNU General Public | ||
13 | License is intended to guarantee your freedom to share and change free | ||
14 | software--to make sure the software is free for all its users. This | ||
15 | General Public License applies to most of the Free Software | ||
16 | Foundation's software and to any other program whose authors commit to | ||
17 | using it. (Some other Free Software Foundation software is covered by | ||
18 | the GNU Library General Public License instead.) You can apply it to | ||
19 | your programs, too. | ||
20 | |||
21 | When we speak of free software, we are referring to freedom, not | ||
22 | price. Our General Public Licenses are designed to make sure that you | ||
23 | have the freedom to distribute copies of free software (and charge for | ||
24 | this service if you wish), that you receive source code or can get it | ||
25 | if you want it, that you can change the software or use pieces of it | ||
26 | in new free programs; and that you know you can do these things. | ||
27 | |||
28 | To protect your rights, we need to make restrictions that forbid | ||
29 | anyone to deny you these rights or to ask you to surrender the rights. | ||
30 | These restrictions translate to certain responsibilities for you if you | ||
31 | distribute copies of the software, or if you modify it. | ||
32 | |||
33 | For example, if you distribute copies of such a program, whether | ||
34 | gratis or for a fee, you must give the recipients all the rights that | ||
35 | you have. You must make sure that they, too, receive or can get the | ||
36 | source code. And you must show them these terms so they know their | ||
37 | rights. | ||
38 | |||
39 | We protect your rights with two steps: (1) copyright the software, and | ||
40 | (2) offer you this license which gives you legal permission to copy, | ||
41 | distribute and/or modify the software. | ||
42 | |||
43 | Also, for each author's protection and ours, we want to make certain | ||
44 | that everyone understands that there is no warranty for this free | ||
45 | software. If the software is modified by someone else and passed on, we | ||
46 | want its recipients to know that what they have is not the original, so | ||
47 | that any problems introduced by others will not reflect on the original | ||
48 | authors' reputations. | ||
49 | |||
50 | Finally, any free program is threatened constantly by software | ||
51 | patents. We wish to avoid the danger that redistributors of a free | ||
52 | program will individually obtain patent licenses, in effect making the | ||
53 | program proprietary. To prevent this, we have made it clear that any | ||
54 | patent must be licensed for everyone's free use or not licensed at all. | ||
55 | |||
56 | The precise terms and conditions for copying, distribution and | ||
57 | modification follow. | ||
58 | |||
59 | GNU GENERAL PUBLIC LICENSE | ||
60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||
61 | |||
62 | 0. This License applies to any program or other work which contains | ||
63 | a notice placed by the copyright holder saying it may be distributed | ||
64 | under the terms of this General Public License. The "Program", below, | ||
65 | refers to any such program or work, and a "work based on the Program" | ||
66 | means either the Program or any derivative work under copyright law: | ||
67 | that is to say, a work containing the Program or a portion of it, | ||
68 | either verbatim or with modifications and/or translated into another | ||
69 | language. (Hereinafter, translation is included without limitation in | ||
70 | the term "modification".) Each licensee is addressed as "you". | ||
71 | |||
72 | Activities other than copying, distribution and modification are not | ||
73 | covered by this License; they are outside its scope. The act of | ||
74 | running the Program is not restricted, and the output from the Program | ||
75 | is covered only if its contents constitute a work based on the | ||
76 | Program (independent of having been made by running the Program). | ||
77 | Whether that is true depends on what the Program does. | ||
78 | |||
79 | 1. You may copy and distribute verbatim copies of the Program's | ||
80 | source code as you receive it, in any medium, provided that you | ||
81 | conspicuously and appropriately publish on each copy an appropriate | ||
82 | copyright notice and disclaimer of warranty; keep intact all the | ||
83 | notices that refer to this License and to the absence of any warranty; | ||
84 | and give any other recipients of the Program a copy of this License | ||
85 | along with the Program. | ||
86 | |||
87 | You may charge a fee for the physical act of transferring a copy, and | ||
88 | you may at your option offer warranty protection in exchange for a fee. | ||
89 | |||
90 | 2. You may modify your copy or copies of the Program or any portion | ||
91 | of it, thus forming a work based on the Program, and copy and | ||
92 | distribute such modifications or work under the terms of Section 1 | ||
93 | above, provided that you also meet all of these conditions: | ||
94 | |||
95 | a) You must cause the modified files to carry prominent notices | ||
96 | stating that you changed the files and the date of any change. | ||
97 | |||
98 | b) You must cause any work that you distribute or publish, that in | ||
99 | whole or in part contains or is derived from the Program or any | ||
100 | part thereof, to be licensed as a whole at no charge to all third | ||
101 | parties under the terms of this License. | ||
102 | |||
103 | c) If the modified program normally reads commands interactively | ||
104 | when run, you must cause it, when started running for such | ||
105 | interactive use in the most ordinary way, to print or display an | ||
106 | announcement including an appropriate copyright notice and a | ||
107 | notice that there is no warranty (or else, saying that you provide | ||
108 | a warranty) and that users may redistribute the program under | ||
109 | these conditions, and telling the user how to view a copy of this | ||
110 | License. (Exception: if the Program itself is interactive but | ||
111 | does not normally print such an announcement, your work based on | ||
112 | the Program is not required to print an announcement.) | ||
113 | |||
114 | These requirements apply to the modified work as a whole. If | ||
115 | identifiable sections of that work are not derived from the Program, | ||
116 | and can be reasonably considered independent and separate works in | ||
117 | themselves, then this License, and its terms, do not apply to those | ||
118 | sections when you distribute them as separate works. But when you | ||
119 | distribute the same sections as part of a whole which is a work based | ||
120 | on the Program, the distribution of the whole must be on the terms of | ||
121 | this License, whose permissions for other licensees extend to the | ||
122 | entire whole, and thus to each and every part regardless of who wrote it. | ||
123 | |||
124 | Thus, it is not the intent of this section to claim rights or contest | ||
125 | your rights to work written entirely by you; rather, the intent is to | ||
126 | exercise the right to control the distribution of derivative or | ||
127 | collective works based on the Program. | ||
128 | |||
129 | In addition, mere aggregation of another work not based on the Program | ||
130 | with the Program (or with a work based on the Program) on a volume of | ||
131 | a storage or distribution medium does not bring the other work under | ||
132 | the scope of this License. | ||
133 | |||
134 | 3. You may copy and distribute the Program (or a work based on it, | ||
135 | under Section 2) in object code or executable form under the terms of | ||
136 | Sections 1 and 2 above provided that you also do one of the following: | ||
137 | |||
138 | a) Accompany it with the complete corresponding machine-readable | ||
139 | source code, which must be distributed under the terms of Sections | ||
140 | 1 and 2 above on a medium customarily used for software interchange; or, | ||
141 | |||
142 | b) Accompany it with a written offer, valid for at least three | ||
143 | years, to give any third party, for a charge no more than your | ||
144 | cost of physically performing source distribution, a complete | ||
145 | machine-readable copy of the corresponding source code, to be | ||
146 | distributed under the terms of Sections 1 and 2 above on a medium | ||
147 | customarily used for software interchange; or, | ||
148 | |||
149 | c) Accompany it with the information you received as to the offer | ||
150 | to distribute corresponding source code. (This alternative is | ||
151 | allowed only for noncommercial distribution and only if you | ||
152 | received the program in object code or executable form with such | ||
153 | an offer, in accord with Subsection b above.) | ||
154 | |||
155 | The source code for a work means the preferred form of the work for | ||
156 | making modifications to it. For an executable work, complete source | ||
157 | code means all the source code for all modules it contains, plus any | ||
158 | associated interface definition files, plus the scripts used to | ||
159 | control compilation and installation of the executable. However, as a | ||
160 | special exception, the source code distributed need not include | ||
161 | anything that is normally distributed (in either source or binary | ||
162 | form) with the major components (compiler, kernel, and so on) of the | ||
163 | operating system on which the executable runs, unless that component | ||
164 | itself accompanies the executable. | ||
165 | |||
166 | If distribution of executable or object code is made by offering | ||
167 | access to copy from a designated place, then offering equivalent | ||
168 | access to copy the source code from the same place counts as | ||
169 | distribution of the source code, even though third parties are not | ||
170 | compelled to copy the source along with the object code. | ||
171 | |||
172 | 4. You may not copy, modify, sublicense, or distribute the Program | ||
173 | except as expressly provided under this License. Any attempt | ||
174 | otherwise to copy, modify, sublicense or distribute the Program is | ||
175 | void, and will automatically terminate your rights under this License. | ||
176 | However, parties who have received copies, or rights, from you under | ||
177 | this License will not have their licenses terminated so long as such | ||
178 | parties remain in full compliance. | ||
179 | |||
180 | 5. You are not required to accept this License, since you have not | ||
181 | signed it. However, nothing else grants you permission to modify or | ||
182 | distribute the Program or its derivative works. These actions are | ||
183 | prohibited by law if you do not accept this License. Therefore, by | ||
184 | modifying or distributing the Program (or any work based on the | ||
185 | Program), you indicate your acceptance of this License to do so, and | ||
186 | all its terms and conditions for copying, distributing or modifying | ||
187 | the Program or works based on it. | ||
188 | |||
189 | 6. Each time you redistribute the Program (or any work based on the | ||
190 | Program), the recipient automatically receives a license from the | ||
191 | original licensor to copy, distribute or modify the Program subject to | ||
192 | these terms and conditions. You may not impose any further | ||
193 | restrictions on the recipients' exercise of the rights granted herein. | ||
194 | You are not responsible for enforcing compliance by third parties to | ||
195 | this License. | ||
196 | |||
197 | 7. If, as a consequence of a court judgment or allegation of patent | ||
198 | infringement or for any other reason (not limited to patent issues), | ||
199 | conditions are imposed on you (whether by court order, agreement or | ||
200 | otherwise) that contradict the conditions of this License, they do not | ||
201 | excuse you from the conditions of this License. If you cannot | ||
202 | distribute so as to satisfy simultaneously your obligations under this | ||
203 | License and any other pertinent obligations, then as a consequence you | ||
204 | may not distribute the Program at all. For example, if a patent | ||
205 | license would not permit royalty-free redistribution of the Program by | ||
206 | all those who receive copies directly or indirectly through you, then | ||
207 | the only way you could satisfy both it and this License would be to | ||
208 | refrain entirely from distribution of the Program. | ||
209 | |||
210 | If any portion of this section is held invalid or unenforceable under | ||
211 | any particular circumstance, the balance of the section is intended to | ||
212 | apply and the section as a whole is intended to apply in other | ||
213 | circumstances. | ||
214 | |||
215 | It is not the purpose of this section to induce you to infringe any | ||
216 | patents or other property right claims or to contest validity of any | ||
217 | such claims; this section has the sole purpose of protecting the | ||
218 | integrity of the free software distribution system, which is | ||
219 | implemented by public license practices. Many people have made | ||
220 | generous contributions to the wide range of software distributed | ||
221 | through that system in reliance on consistent application of that | ||
222 | system; it is up to the author/donor to decide if he or she is willing | ||
223 | to distribute software through any other system and a licensee cannot | ||
224 | impose that choice. | ||
225 | |||
226 | This section is intended to make thoroughly clear what is believed to | ||
227 | be a consequence of the rest of this License. | ||
228 | |||
229 | 8. If the distribution and/or use of the Program is restricted in | ||
230 | certain countries either by patents or by copyrighted interfaces, the | ||
231 | original copyright holder who places the Program under this License | ||
232 | may add an explicit geographical distribution limitation excluding | ||
233 | those countries, so that distribution is permitted only in or among | ||
234 | countries not thus excluded. In such case, this License incorporates | ||
235 | the limitation as if written in the body of this License. | ||
236 | |||
237 | 9. The Free Software Foundation may publish revised and/or new versions | ||
238 | of the General Public License from time to time. Such new versions will | ||
239 | be similar in spirit to the present version, but may differ in detail to | ||
240 | address new problems or concerns. | ||
241 | |||
242 | Each version is given a distinguishing version number. If the Program | ||
243 | specifies a version number of this License which applies to it and "any | ||
244 | later version", you have the option of following the terms and conditions | ||
245 | either of that version or of any later version published by the Free | ||
246 | Software Foundation. If the Program does not specify a version number of | ||
247 | this License, you may choose any version ever published by the Free Software | ||
248 | Foundation. | ||
249 | |||
250 | 10. If you wish to incorporate parts of the Program into other free | ||
251 | programs whose distribution conditions are different, write to the author | ||
252 | to ask for permission. For software which is copyrighted by the Free | ||
253 | Software Foundation, write to the Free Software Foundation; we sometimes | ||
254 | make exceptions for this. Our decision will be guided by the two goals | ||
255 | of preserving the free status of all derivatives of our free software and | ||
256 | of promoting the sharing and reuse of software generally. | ||
257 | |||
258 | NO WARRANTY | ||
259 | |||
260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||
261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | ||
262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||
263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||
264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | ||
266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | ||
267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||
268 | REPAIR OR CORRECTION. | ||
269 | |||
270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||
271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||
272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||
273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||
274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||
275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||
276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||
277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||
278 | POSSIBILITY OF SUCH DAMAGES. | ||
279 | |||
280 | END OF TERMS AND CONDITIONS | ||
281 | |||
282 | How to Apply These Terms to Your New Programs | ||
283 | |||
284 | If you develop a new program, and you want it to be of the greatest | ||
285 | possible use to the public, the best way to achieve this is to make it | ||
286 | free software which everyone can redistribute and change under these terms. | ||
287 | |||
288 | To do so, attach the following notices to the program. It is safest | ||
289 | to attach them to the start of each source file to most effectively | ||
290 | convey the exclusion of warranty; and each file should have at least | ||
291 | the "copyright" line and a pointer to where the full notice is found. | ||
292 | |||
293 | <one line to give the program's name and a brief idea of what it does.> | ||
294 | Copyright (C) <year> <name of author> | ||
295 | |||
296 | This program is free software; you can redistribute it and/or modify | ||
297 | it under the terms of the GNU General Public License as published by | ||
298 | the Free Software Foundation; either version 2 of the License, or | ||
299 | (at your option) any later version. | ||
300 | |||
301 | This program is distributed in the hope that it will be useful, | ||
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
304 | GNU General Public License for more details. | ||
305 | |||
306 | You should have received a copy of the GNU General Public License | ||
307 | along with this program; if not, write to the Free Software | ||
308 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
309 | |||
310 | |||
311 | Also add information on how to contact you by electronic and paper mail. | ||
312 | |||
313 | If the program is interactive, make it output a short notice like this | ||
314 | when it starts in an interactive mode: | ||
315 | |||
316 | Gnomovision version 69, Copyright (C) year name of author | ||
317 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||
318 | This is free software, and you are welcome to redistribute it | ||
319 | under certain conditions; type `show c' for details. | ||
320 | |||
321 | The hypothetical commands `show w' and `show c' should show the appropriate | ||
322 | parts of the General Public License. Of course, the commands you use may | ||
323 | be called something other than `show w' and `show c'; they could even be | ||
324 | mouse-clicks or menu items--whatever suits your program. | ||
325 | |||
326 | You should also get your employer (if you work as a programmer) or your | ||
327 | school, if any, to sign a "copyright disclaimer" for the program, if | ||
328 | necessary. Here is a sample; alter the names: | ||
329 | |||
330 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||
331 | `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||
332 | |||
333 | <signature of Ty Coon>, 1 April 1989 | ||
334 | Ty Coon, President of Vice | ||
335 | |||
336 | This General Public License does not permit incorporating your program into | ||
337 | proprietary programs. If your program is a subroutine library, you may | ||
338 | consider it more useful to permit linking proprietary applications with the | ||
339 | library. If this is what you want to do, use the GNU Library General | ||
340 | Public License instead of this License. | ||
diff --git a/drivers/staging/usbip/userspace/INSTALL b/drivers/staging/usbip/userspace/INSTALL deleted file mode 100644 index d3c5b40a9409..000000000000 --- a/drivers/staging/usbip/userspace/INSTALL +++ /dev/null | |||
@@ -1,237 +0,0 @@ | |||
1 | Installation Instructions | ||
2 | ************************* | ||
3 | |||
4 | Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, | ||
5 | 2006, 2007 Free Software Foundation, Inc. | ||
6 | |||
7 | This file is free documentation; the Free Software Foundation gives | ||
8 | unlimited permission to copy, distribute and modify it. | ||
9 | |||
10 | Basic Installation | ||
11 | ================== | ||
12 | |||
13 | Briefly, the shell commands `./configure; make; make install' should | ||
14 | configure, build, and install this package. The following | ||
15 | more-detailed instructions are generic; see the `README' file for | ||
16 | instructions specific to this package. | ||
17 | |||
18 | The `configure' shell script attempts to guess correct values for | ||
19 | various system-dependent variables used during compilation. It uses | ||
20 | those values to create a `Makefile' in each directory of the package. | ||
21 | It may also create one or more `.h' files containing system-dependent | ||
22 | definitions. Finally, it creates a shell script `config.status' that | ||
23 | you can run in the future to recreate the current configuration, and a | ||
24 | file `config.log' containing compiler output (useful mainly for | ||
25 | debugging `configure'). | ||
26 | |||
27 | It can also use an optional file (typically called `config.cache' | ||
28 | and enabled with `--cache-file=config.cache' or simply `-C') that saves | ||
29 | the results of its tests to speed up reconfiguring. Caching is | ||
30 | disabled by default to prevent problems with accidental use of stale | ||
31 | cache files. | ||
32 | |||
33 | If you need to do unusual things to compile the package, please try | ||
34 | to figure out how `configure' could check whether to do them, and mail | ||
35 | diffs or instructions to the address given in the `README' so they can | ||
36 | be considered for the next release. If you are using the cache, and at | ||
37 | some point `config.cache' contains results you don't want to keep, you | ||
38 | may remove or edit it. | ||
39 | |||
40 | The file `configure.ac' (or `configure.in') is used to create | ||
41 | `configure' by a program called `autoconf'. You need `configure.ac' if | ||
42 | you want to change it or regenerate `configure' using a newer version | ||
43 | of `autoconf'. | ||
44 | |||
45 | The simplest way to compile this package is: | ||
46 | |||
47 | 1. `cd' to the directory containing the package's source code and type | ||
48 | `./configure' to configure the package for your system. | ||
49 | |||
50 | Running `configure' might take a while. While running, it prints | ||
51 | some messages telling which features it is checking for. | ||
52 | |||
53 | 2. Type `make' to compile the package. | ||
54 | |||
55 | 3. Optionally, type `make check' to run any self-tests that come with | ||
56 | the package. | ||
57 | |||
58 | 4. Type `make install' to install the programs and any data files and | ||
59 | documentation. | ||
60 | |||
61 | 5. You can remove the program binaries and object files from the | ||
62 | source code directory by typing `make clean'. To also remove the | ||
63 | files that `configure' created (so you can compile the package for | ||
64 | a different kind of computer), type `make distclean'. There is | ||
65 | also a `make maintainer-clean' target, but that is intended mainly | ||
66 | for the package's developers. If you use it, you may have to get | ||
67 | all sorts of other programs in order to regenerate files that came | ||
68 | with the distribution. | ||
69 | |||
70 | 6. Often, you can also type `make uninstall' to remove the installed | ||
71 | files again. | ||
72 | |||
73 | Compilers and Options | ||
74 | ===================== | ||
75 | |||
76 | Some systems require unusual options for compilation or linking that the | ||
77 | `configure' script does not know about. Run `./configure --help' for | ||
78 | details on some of the pertinent environment variables. | ||
79 | |||
80 | You can give `configure' initial values for configuration parameters | ||
81 | by setting variables in the command line or in the environment. Here | ||
82 | is an example: | ||
83 | |||
84 | ./configure CC=c99 CFLAGS=-g LIBS=-lposix | ||
85 | |||
86 | *Note Defining Variables::, for more details. | ||
87 | |||
88 | Compiling For Multiple Architectures | ||
89 | ==================================== | ||
90 | |||
91 | You can compile the package for more than one kind of computer at the | ||
92 | same time, by placing the object files for each architecture in their | ||
93 | own directory. To do this, you can use GNU `make'. `cd' to the | ||
94 | directory where you want the object files and executables to go and run | ||
95 | the `configure' script. `configure' automatically checks for the | ||
96 | source code in the directory that `configure' is in and in `..'. | ||
97 | |||
98 | With a non-GNU `make', it is safer to compile the package for one | ||
99 | architecture at a time in the source code directory. After you have | ||
100 | installed the package for one architecture, use `make distclean' before | ||
101 | reconfiguring for another architecture. | ||
102 | |||
103 | Installation Names | ||
104 | ================== | ||
105 | |||
106 | By default, `make install' installs the package's commands under | ||
107 | `/usr/local/bin', include files under `/usr/local/include', etc. You | ||
108 | can specify an installation prefix other than `/usr/local' by giving | ||
109 | `configure' the option `--prefix=PREFIX'. | ||
110 | |||
111 | You can specify separate installation prefixes for | ||
112 | architecture-specific files and architecture-independent files. If you | ||
113 | pass the option `--exec-prefix=PREFIX' to `configure', the package uses | ||
114 | PREFIX as the prefix for installing programs and libraries. | ||
115 | Documentation and other data files still use the regular prefix. | ||
116 | |||
117 | In addition, if you use an unusual directory layout you can give | ||
118 | options like `--bindir=DIR' to specify different values for particular | ||
119 | kinds of files. Run `configure --help' for a list of the directories | ||
120 | you can set and what kinds of files go in them. | ||
121 | |||
122 | If the package supports it, you can cause programs to be installed | ||
123 | with an extra prefix or suffix on their names by giving `configure' the | ||
124 | option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. | ||
125 | |||
126 | Optional Features | ||
127 | ================= | ||
128 | |||
129 | Some packages pay attention to `--enable-FEATURE' options to | ||
130 | `configure', where FEATURE indicates an optional part of the package. | ||
131 | They may also pay attention to `--with-PACKAGE' options, where PACKAGE | ||
132 | is something like `gnu-as' or `x' (for the X Window System). The | ||
133 | `README' should mention any `--enable-' and `--with-' options that the | ||
134 | package recognizes. | ||
135 | |||
136 | For packages that use the X Window System, `configure' can usually | ||
137 | find the X include and library files automatically, but if it doesn't, | ||
138 | you can use the `configure' options `--x-includes=DIR' and | ||
139 | `--x-libraries=DIR' to specify their locations. | ||
140 | |||
141 | Specifying the System Type | ||
142 | ========================== | ||
143 | |||
144 | There may be some features `configure' cannot figure out automatically, | ||
145 | but needs to determine by the type of machine the package will run on. | ||
146 | Usually, assuming the package is built to be run on the _same_ | ||
147 | architectures, `configure' can figure that out, but if it prints a | ||
148 | message saying it cannot guess the machine type, give it the | ||
149 | `--build=TYPE' option. TYPE can either be a short name for the system | ||
150 | type, such as `sun4', or a canonical name which has the form: | ||
151 | |||
152 | CPU-COMPANY-SYSTEM | ||
153 | |||
154 | where SYSTEM can have one of these forms: | ||
155 | |||
156 | OS KERNEL-OS | ||
157 | |||
158 | See the file `config.sub' for the possible values of each field. If | ||
159 | `config.sub' isn't included in this package, then this package doesn't | ||
160 | need to know the machine type. | ||
161 | |||
162 | If you are _building_ compiler tools for cross-compiling, you should | ||
163 | use the option `--target=TYPE' to select the type of system they will | ||
164 | produce code for. | ||
165 | |||
166 | If you want to _use_ a cross compiler, that generates code for a | ||
167 | platform different from the build platform, you should specify the | ||
168 | "host" platform (i.e., that on which the generated programs will | ||
169 | eventually be run) with `--host=TYPE'. | ||
170 | |||
171 | Sharing Defaults | ||
172 | ================ | ||
173 | |||
174 | If you want to set default values for `configure' scripts to share, you | ||
175 | can create a site shell script called `config.site' that gives default | ||
176 | values for variables like `CC', `cache_file', and `prefix'. | ||
177 | `configure' looks for `PREFIX/share/config.site' if it exists, then | ||
178 | `PREFIX/etc/config.site' if it exists. Or, you can set the | ||
179 | `CONFIG_SITE' environment variable to the location of the site script. | ||
180 | A warning: not all `configure' scripts look for a site script. | ||
181 | |||
182 | Defining Variables | ||
183 | ================== | ||
184 | |||
185 | Variables not defined in a site shell script can be set in the | ||
186 | environment passed to `configure'. However, some packages may run | ||
187 | configure again during the build, and the customized values of these | ||
188 | variables may be lost. In order to avoid this problem, you should set | ||
189 | them in the `configure' command line, using `VAR=value'. For example: | ||
190 | |||
191 | ./configure CC=/usr/local2/bin/gcc | ||
192 | |||
193 | causes the specified `gcc' to be used as the C compiler (unless it is | ||
194 | overridden in the site shell script). | ||
195 | |||
196 | Unfortunately, this technique does not work for `CONFIG_SHELL' due to | ||
197 | an Autoconf bug. Until the bug is fixed you can use this workaround: | ||
198 | |||
199 | CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash | ||
200 | |||
201 | `configure' Invocation | ||
202 | ====================== | ||
203 | |||
204 | `configure' recognizes the following options to control how it operates. | ||
205 | |||
206 | `--help' | ||
207 | `-h' | ||
208 | Print a summary of the options to `configure', and exit. | ||
209 | |||
210 | `--version' | ||
211 | `-V' | ||
212 | Print the version of Autoconf used to generate the `configure' | ||
213 | script, and exit. | ||
214 | |||
215 | `--cache-file=FILE' | ||
216 | Enable the cache: use and save the results of the tests in FILE, | ||
217 | traditionally `config.cache'. FILE defaults to `/dev/null' to | ||
218 | disable caching. | ||
219 | |||
220 | `--config-cache' | ||
221 | `-C' | ||
222 | Alias for `--cache-file=config.cache'. | ||
223 | |||
224 | `--quiet' | ||
225 | `--silent' | ||
226 | `-q' | ||
227 | Do not print messages saying which checks are being made. To | ||
228 | suppress all normal output, redirect it to `/dev/null' (any error | ||
229 | messages will still be shown). | ||
230 | |||
231 | `--srcdir=DIR' | ||
232 | Look for the package's source code in directory DIR. Usually | ||
233 | `configure' can determine that directory automatically. | ||
234 | |||
235 | `configure' also accepts some other, not widely useful, options. Run | ||
236 | `configure --help' for more details. | ||
237 | |||
diff --git a/drivers/staging/usbip/userspace/Makefile.am b/drivers/staging/usbip/userspace/Makefile.am deleted file mode 100644 index 66f8bf038c9f..000000000000 --- a/drivers/staging/usbip/userspace/Makefile.am +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | SUBDIRS := libsrc src | ||
2 | includedir = @includedir@/usbip | ||
3 | include_HEADERS := $(addprefix libsrc/, \ | ||
4 | usbip_common.h vhci_driver.h usbip_host_driver.h) | ||
5 | |||
6 | dist_man_MANS := $(addprefix doc/, usbip.8 usbipd.8) | ||
diff --git a/drivers/staging/usbip/userspace/README b/drivers/staging/usbip/userspace/README deleted file mode 100644 index 831f49fea3ce..000000000000 --- a/drivers/staging/usbip/userspace/README +++ /dev/null | |||
@@ -1,202 +0,0 @@ | |||
1 | # | ||
2 | # README for usbip-utils | ||
3 | # | ||
4 | # Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
5 | # 2005-2008 Takahiro Hirofuchi | ||
6 | |||
7 | |||
8 | [Requirements] | ||
9 | - USB/IP device drivers | ||
10 | Found in the staging directory of the Linux kernel. | ||
11 | |||
12 | - libudev >= 2.0 | ||
13 | libudev library | ||
14 | |||
15 | - libwrap0-dev | ||
16 | tcp wrapper library | ||
17 | |||
18 | - gcc >= 4.0 | ||
19 | |||
20 | - libtool, automake >= 1.9, autoconf >= 2.5.0, pkg-config | ||
21 | |||
22 | [Optional] | ||
23 | - hwdata | ||
24 | Contains USB device identification data. | ||
25 | |||
26 | |||
27 | [Install] | ||
28 | 0. Generate configuration scripts. | ||
29 | $ ./autogen.sh | ||
30 | |||
31 | 1. Compile & install the userspace utilities. | ||
32 | $ ./configure [--with-tcp-wrappers=no] [--with-usbids-dir=<dir>] | ||
33 | $ make install | ||
34 | |||
35 | 2. Compile & install USB/IP drivers. | ||
36 | |||
37 | |||
38 | [Usage] | ||
39 | server:# (Physically attach your USB device.) | ||
40 | |||
41 | server:# insmod usbip-core.ko | ||
42 | server:# insmod usbip-host.ko | ||
43 | |||
44 | server:# usbipd -D | ||
45 | - Start usbip daemon. | ||
46 | |||
47 | server:# usbip list -l | ||
48 | - List driver assignments for USB devices. | ||
49 | |||
50 | server:# usbip bind --busid 1-2 | ||
51 | - Bind usbip-host.ko to the device with busid 1-2. | ||
52 | - The USB device 1-2 is now exportable to other hosts! | ||
53 | - Use `usbip unbind --busid 1-2' to stop exporting the device. | ||
54 | |||
55 | client:# insmod usbip-core.ko | ||
56 | client:# insmod vhci-hcd.ko | ||
57 | |||
58 | client:# usbip list --remote <host> | ||
59 | - List exported USB devices on the <host>. | ||
60 | |||
61 | client:# usbip attach --remote <host> --busid 1-2 | ||
62 | - Connect the remote USB device. | ||
63 | |||
64 | client:# usbip port | ||
65 | - Show virtual port status. | ||
66 | |||
67 | client:# usbip detach --port <port> | ||
68 | - Detach the USB device. | ||
69 | |||
70 | |||
71 | [Example] | ||
72 | --------------------------- | ||
73 | SERVER SIDE | ||
74 | --------------------------- | ||
75 | Physically attach your USB devices to this host. | ||
76 | |||
77 | trois:# insmod path/to/usbip-core.ko | ||
78 | trois:# insmod path/to/usbip-host.ko | ||
79 | trois:# usbipd -D | ||
80 | |||
81 | In another terminal, let's look up what USB devices are physically | ||
82 | attached to this host. | ||
83 | |||
84 | trois:# usbip list -l | ||
85 | Local USB devices | ||
86 | ================= | ||
87 | - busid 1-1 (05a9:a511) | ||
88 | 1-1:1.0 -> ov511 | ||
89 | |||
90 | - busid 3-2 (0711:0902) | ||
91 | 3-2:1.0 -> none | ||
92 | |||
93 | - busid 3-3.1 (08bb:2702) | ||
94 | 3-3.1:1.0 -> snd-usb-audio | ||
95 | 3-3.1:1.1 -> snd-usb-audio | ||
96 | |||
97 | - busid 3-3.2 (04bb:0206) | ||
98 | 3-3.2:1.0 -> usb-storage | ||
99 | |||
100 | - busid 3-3 (0409:0058) | ||
101 | 3-3:1.0 -> hub | ||
102 | |||
103 | - busid 4-1 (046d:08b2) | ||
104 | 4-1:1.0 -> none | ||
105 | 4-1:1.1 -> none | ||
106 | 4-1:1.2 -> none | ||
107 | |||
108 | - busid 5-2 (058f:9254) | ||
109 | 5-2:1.0 -> hub | ||
110 | |||
111 | A USB storage device of busid 3-3.2 is now bound to the usb-storage | ||
112 | driver. To export this device, we first mark the device as | ||
113 | "exportable"; the device is bound to the usbip-host driver. Please | ||
114 | remember you can not export a USB hub. | ||
115 | |||
116 | Mark the device of busid 3-3.2 as exportable: | ||
117 | |||
118 | trois:# usbip --debug bind --busid 3-3.2 | ||
119 | ... | ||
120 | usbip debug: usbip_bind.c:162:[unbind_other] 3-3.2:1.0 -> usb-storage | ||
121 | ... | ||
122 | bind device on busid 3-3.2: complete | ||
123 | |||
124 | trois:# usbip list -l | ||
125 | Local USB devices | ||
126 | ================= | ||
127 | ... | ||
128 | |||
129 | - busid 3-3.2 (04bb:0206) | ||
130 | 3-3.2:1.0 -> usbip-host | ||
131 | ... | ||
132 | |||
133 | --------------------------- | ||
134 | CLIENT SIDE | ||
135 | --------------------------- | ||
136 | First, let's list available remote devices that are marked as | ||
137 | exportable on the host. | ||
138 | |||
139 | deux:# insmod path/to/usbip-core.ko | ||
140 | deux:# insmod path/to/vhci-hcd.ko | ||
141 | |||
142 | deux:# usbip list --remote 10.0.0.3 | ||
143 | Exportable USB devices | ||
144 | ====================== | ||
145 | - 10.0.0.3 | ||
146 | 1-1: Prolific Technology, Inc. : unknown product (067b:3507) | ||
147 | : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-1 | ||
148 | : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) | ||
149 | : 0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50) | ||
150 | |||
151 | 1-2.2.1: Apple Computer, Inc. : unknown product (05ac:0203) | ||
152 | : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.1 | ||
153 | : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) | ||
154 | : 0 - Human Interface Devices / Boot Interface Subclass / Keyboard (03/01/01) | ||
155 | |||
156 | 1-2.2.3: OmniVision Technologies, Inc. : OV511+ WebCam (05a9:a511) | ||
157 | : /sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2.2/1-2.2.3 | ||
158 | : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) | ||
159 | : 0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00) | ||
160 | |||
161 | 3-1: Logitech, Inc. : QuickCam Pro 4000 (046d:08b2) | ||
162 | : /sys/devices/pci0000:00/0000:00:1e.0/0000:02:0a.0/usb3/3-1 | ||
163 | : (Defined at Interface level) / unknown subclass / unknown protocol (00/00/00) | ||
164 | : 0 - Data / unknown subclass / unknown protocol (0a/ff/00) | ||
165 | : 1 - Audio / Control Device / unknown protocol (01/01/00) | ||
166 | : 2 - Audio / Streaming / unknown protocol (01/02/00) | ||
167 | |||
168 | Attach a remote USB device: | ||
169 | |||
170 | deux:# usbip attach --remote 10.0.0.3 --busid 1-1 | ||
171 | port 0 attached | ||
172 | |||
173 | Show the devices attached to this client: | ||
174 | |||
175 | deux:# usbip port | ||
176 | Port 00: <Port in Use> at Full Speed(12Mbps) | ||
177 | Prolific Technology, Inc. : unknown product (067b:3507) | ||
178 | 6-1 -> usbip://10.0.0.3:3240/1-1 (remote bus/dev 001/004) | ||
179 | 6-1:1.0 used by usb-storage | ||
180 | /sys/class/scsi_device/0:0:0:0/device | ||
181 | /sys/class/scsi_host/host0/device | ||
182 | /sys/block/sda/device | ||
183 | |||
184 | Detach the imported device: | ||
185 | |||
186 | deux:# usbip detach --port 0 | ||
187 | port 0 detached | ||
188 | |||
189 | |||
190 | [Checklist] | ||
191 | - See 'Debug Tips' on the project wiki. | ||
192 | - http://usbip.wiki.sourceforge.net/how-to-debug-usbip | ||
193 | - usbip-host.ko must be bound to the target device. | ||
194 | - See /proc/bus/usb/devices and find "Driver=..." lines of the device. | ||
195 | - Shutdown firewall. | ||
196 | - usbip now uses TCP port 3240. | ||
197 | - Disable SELinux. | ||
198 | - Check the kernel and daemon messages. | ||
199 | |||
200 | |||
201 | [Contact] | ||
202 | Mailing List: linux-usb@vger.kernel.org | ||
diff --git a/drivers/staging/usbip/userspace/autogen.sh b/drivers/staging/usbip/userspace/autogen.sh deleted file mode 100755 index e1112d3fcbf6..000000000000 --- a/drivers/staging/usbip/userspace/autogen.sh +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | #!/bin/sh -x | ||
2 | |||
3 | #aclocal | ||
4 | #autoheader | ||
5 | #libtoolize --copy --force | ||
6 | #automake-1.9 -acf | ||
7 | #autoconf | ||
8 | |||
9 | autoreconf -i -f -v | ||
diff --git a/drivers/staging/usbip/userspace/cleanup.sh b/drivers/staging/usbip/userspace/cleanup.sh deleted file mode 100755 index 955c3ccb729a..000000000000 --- a/drivers/staging/usbip/userspace/cleanup.sh +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | #!/bin/sh | ||
2 | |||
3 | if [ -r Makefile ]; then | ||
4 | make distclean | ||
5 | fi | ||
6 | |||
7 | FILES="aclocal.m4 autom4te.cache compile config.guess config.h.in config.log \ | ||
8 | config.status config.sub configure cscope.out depcomp install-sh \ | ||
9 | libsrc/Makefile libsrc/Makefile.in libtool ltmain.sh Makefile \ | ||
10 | Makefile.in missing src/Makefile src/Makefile.in" | ||
11 | |||
12 | rm -vRf $FILES | ||
diff --git a/drivers/staging/usbip/userspace/configure.ac b/drivers/staging/usbip/userspace/configure.ac deleted file mode 100644 index 607d05c5ccfd..000000000000 --- a/drivers/staging/usbip/userspace/configure.ac +++ /dev/null | |||
@@ -1,111 +0,0 @@ | |||
1 | dnl Process this file with autoconf to produce a configure script. | ||
2 | |||
3 | AC_PREREQ(2.59) | ||
4 | AC_INIT([usbip-utils], [2.0], [linux-usb@vger.kernel.org]) | ||
5 | AC_DEFINE([USBIP_VERSION], [0x00000111], [binary-coded decimal version number]) | ||
6 | |||
7 | CURRENT=0 | ||
8 | REVISION=1 | ||
9 | AGE=0 | ||
10 | AC_SUBST([LIBUSBIP_VERSION], [$CURRENT:$REVISION:$AGE], [library version]) | ||
11 | |||
12 | AC_CONFIG_SRCDIR([src/usbipd.c]) | ||
13 | AC_CONFIG_HEADERS([config.h]) | ||
14 | |||
15 | AM_INIT_AUTOMAKE([foreign]) | ||
16 | LT_INIT | ||
17 | |||
18 | # Silent build for automake >= 1.11 | ||
19 | m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) | ||
20 | |||
21 | AC_SUBST([EXTRA_CFLAGS], ["-Wall -Werror -Wextra -std=gnu99"]) | ||
22 | |||
23 | # Checks for programs. | ||
24 | AC_PROG_CC | ||
25 | AC_PROG_INSTALL | ||
26 | AC_PROG_MAKE_SET | ||
27 | |||
28 | # Checks for header files. | ||
29 | AC_HEADER_DIRENT | ||
30 | AC_HEADER_STDC | ||
31 | AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h stdint.h stdlib.h dnl | ||
32 | string.h sys/socket.h syslog.h unistd.h]) | ||
33 | |||
34 | # Checks for typedefs, structures, and compiler characteristics. | ||
35 | AC_TYPE_INT32_T | ||
36 | AC_TYPE_SIZE_T | ||
37 | AC_TYPE_SSIZE_T | ||
38 | AC_TYPE_UINT16_T | ||
39 | AC_TYPE_UINT32_T | ||
40 | AC_TYPE_UINT8_T | ||
41 | |||
42 | # Checks for library functions. | ||
43 | AC_FUNC_REALLOC | ||
44 | AC_CHECK_FUNCS([memset mkdir regcomp socket strchr strerror strstr dnl | ||
45 | strtoul]) | ||
46 | |||
47 | AC_CHECK_HEADER([libudev.h], | ||
48 | [AC_CHECK_LIB([udev], [udev_new], | ||
49 | [LIBS="$LIBS -ludev"], | ||
50 | [AC_MSG_ERROR([Missing udev library!])])], | ||
51 | [AC_MSG_ERROR([Missing /usr/include/libudev.h])]) | ||
52 | |||
53 | # Checks for libwrap library. | ||
54 | AC_MSG_CHECKING([whether to use the libwrap (TCP wrappers) library]) | ||
55 | AC_ARG_WITH([tcp-wrappers], | ||
56 | [AS_HELP_STRING([--with-tcp-wrappers], | ||
57 | [use the libwrap (TCP wrappers) library])], | ||
58 | dnl [ACTION-IF-GIVEN] | ||
59 | [if test "$withval" = "yes"; then | ||
60 | AC_MSG_RESULT([yes]) | ||
61 | AC_MSG_CHECKING([for hosts_access in -lwrap]) | ||
62 | saved_LIBS="$LIBS" | ||
63 | LIBS="-lwrap $saved_LIBS" | ||
64 | AC_TRY_LINK( | ||
65 | [int hosts_access(); int allow_severity, deny_severity;], | ||
66 | [hosts_access()], | ||
67 | [AC_MSG_RESULT([yes]); | ||
68 | AC_DEFINE([HAVE_LIBWRAP], [1], | ||
69 | [use tcp wrapper]) wrap_LIB="-lwrap"], | ||
70 | [AC_MSG_RESULT([not found]); exit 1]) | ||
71 | else | ||
72 | AC_MSG_RESULT([no]); | ||
73 | fi], | ||
74 | dnl [ACTION-IF-NOT-GIVEN] | ||
75 | [AC_MSG_RESULT([(default)]) | ||
76 | AC_MSG_CHECKING([for hosts_access in -lwrap]) | ||
77 | saved_LIBS="$LIBS" | ||
78 | LIBS="-lwrap $saved_LIBS" | ||
79 | AC_TRY_LINK( | ||
80 | [int hosts_access(); int allow_severity, deny_severity;], | ||
81 | [hosts_access()], | ||
82 | [AC_MSG_RESULT([yes]); | ||
83 | AC_DEFINE([HAVE_LIBWRAP], [1], [use tcp wrapper])], | ||
84 | [AC_MSG_RESULT([no]); LIBS="$saved_LIBS"])]) | ||
85 | |||
86 | # Sets directory containing usb.ids. | ||
87 | AC_ARG_WITH([usbids-dir], | ||
88 | [AS_HELP_STRING([--with-usbids-dir=DIR], | ||
89 | [where usb.ids is found (default /usr/share/hwdata/)])], | ||
90 | [USBIDS_DIR=$withval], [USBIDS_DIR="/usr/share/hwdata/"]) | ||
91 | AC_SUBST([USBIDS_DIR]) | ||
92 | |||
93 | # use _FORTIFY_SOURCE | ||
94 | AC_MSG_CHECKING([whether to use fortify]) | ||
95 | AC_ARG_WITH([fortify], | ||
96 | [AS_HELP_STRING([--with-fortify], | ||
97 | [use _FORTIFY_SROUCE option when compiling)])], | ||
98 | dnl [ACTION-IF-GIVEN] | ||
99 | [if test "$withval" = "yes"; then | ||
100 | AC_MSG_RESULT([yes]) | ||
101 | CFLAGS="$CFLAGS -D_FORTIFY_SOURCE -O" | ||
102 | else | ||
103 | AC_MSG_RESULT([no]) | ||
104 | CFLAGS="$CFLAGS -U_FORTIFY_SOURCE" | ||
105 | fi | ||
106 | ], | ||
107 | dnl [ACTION-IF-NOT-GIVEN] | ||
108 | [AC_MSG_RESULT([default])]) | ||
109 | |||
110 | AC_CONFIG_FILES([Makefile libsrc/Makefile src/Makefile]) | ||
111 | AC_OUTPUT | ||
diff --git a/drivers/staging/usbip/userspace/doc/usbip.8 b/drivers/staging/usbip/userspace/doc/usbip.8 deleted file mode 100644 index a6097be25d28..000000000000 --- a/drivers/staging/usbip/userspace/doc/usbip.8 +++ /dev/null | |||
@@ -1,95 +0,0 @@ | |||
1 | .TH USBIP "8" "February 2009" "usbip" "System Administration Utilities" | ||
2 | .SH NAME | ||
3 | usbip \- manage USB/IP devices | ||
4 | .SH SYNOPSIS | ||
5 | .B usbip | ||
6 | [\fIoptions\fR] <\fIcommand\fR> <\fIargs\fR> | ||
7 | |||
8 | .SH DESCRIPTION | ||
9 | On a USB/IP server, devices can be listed, bound, and unbound using | ||
10 | this program. On a USB/IP client, devices exported by USB/IP servers | ||
11 | can be listed, attached and detached. | ||
12 | |||
13 | .SH OPTIONS | ||
14 | .HP | ||
15 | \fB\-\-debug\fR | ||
16 | .IP | ||
17 | Print debugging information. | ||
18 | .PP | ||
19 | |||
20 | .HP | ||
21 | \fB\-\-log\fR | ||
22 | .IP | ||
23 | Log to syslog. | ||
24 | .PP | ||
25 | |||
26 | .HP | ||
27 | \fB\-\-tcp-port PORT\fR | ||
28 | .IP | ||
29 | Connect to PORT on remote host (used for attach and list --remote). | ||
30 | .PP | ||
31 | |||
32 | .SH COMMANDS | ||
33 | .HP | ||
34 | \fBversion\fR | ||
35 | .IP | ||
36 | Show version and exit. | ||
37 | .PP | ||
38 | |||
39 | .HP | ||
40 | \fBhelp\fR [\fIcommand\fR] | ||
41 | .IP | ||
42 | Print the program help message, or help on a specific command, and | ||
43 | then exit. | ||
44 | .PP | ||
45 | |||
46 | .HP | ||
47 | \fBattach\fR \-\-remote=<\fIhost\fR> \-\-busid=<\fIbus_id\fR> | ||
48 | .IP | ||
49 | Attach a remote USB device. | ||
50 | .PP | ||
51 | |||
52 | .HP | ||
53 | \fBdetach\fR \-\-port=<\fIport\fR> | ||
54 | .IP | ||
55 | Detach an imported USB device. | ||
56 | .PP | ||
57 | |||
58 | .HP | ||
59 | \fBbind\fR \-\-busid=<\fIbusid\fR> | ||
60 | .IP | ||
61 | Make a device exportable. | ||
62 | .PP | ||
63 | |||
64 | .HP | ||
65 | \fBunbind\fR \-\-busid=<\fIbusid\fR> | ||
66 | .IP | ||
67 | Stop exporting a device so it can be used by a local driver. | ||
68 | .PP | ||
69 | |||
70 | .HP | ||
71 | \fBlist\fR \-\-remote=<\fIhost\fR> | ||
72 | .IP | ||
73 | List USB devices exported by a remote host. | ||
74 | .PP | ||
75 | |||
76 | .HP | ||
77 | \fBlist\fR \-\-local | ||
78 | .IP | ||
79 | List local USB devices. | ||
80 | .PP | ||
81 | |||
82 | |||
83 | .SH EXAMPLES | ||
84 | |||
85 | client:# usbip list --remote=server | ||
86 | - List exportable usb devices on the server. | ||
87 | |||
88 | client:# usbip attach --remote=server --busid=1-2 | ||
89 | - Connect the remote USB device. | ||
90 | |||
91 | client:# usbip detach --port=0 | ||
92 | - Detach the usb device. | ||
93 | |||
94 | .SH "SEE ALSO" | ||
95 | \fBusbipd\fP\fB(8)\fB\fP | ||
diff --git a/drivers/staging/usbip/userspace/doc/usbipd.8 b/drivers/staging/usbip/userspace/doc/usbipd.8 deleted file mode 100644 index ac4635db3f03..000000000000 --- a/drivers/staging/usbip/userspace/doc/usbipd.8 +++ /dev/null | |||
@@ -1,91 +0,0 @@ | |||
1 | .TH USBIP "8" "February 2009" "usbip" "System Administration Utilities" | ||
2 | .SH NAME | ||
3 | usbipd \- USB/IP server daemon | ||
4 | .SH SYNOPSIS | ||
5 | .B usbipd | ||
6 | [\fIoptions\fR] | ||
7 | |||
8 | .SH DESCRIPTION | ||
9 | .B usbipd | ||
10 | provides USB/IP clients access to exported USB devices. | ||
11 | |||
12 | Devices have to explicitly be exported using | ||
13 | .B usbip bind | ||
14 | before usbipd makes them available to other hosts. | ||
15 | |||
16 | The daemon accepts connections from USB/IP clients | ||
17 | on TCP port 3240 by default. | ||
18 | |||
19 | .SH OPTIONS | ||
20 | .HP | ||
21 | \fB\-4\fR, \fB\-\-ipv4\fR | ||
22 | .IP | ||
23 | Bind to IPv4. Default is both. | ||
24 | .PP | ||
25 | |||
26 | .HP | ||
27 | \fB\-6\fR, \fB\-\-ipv6\fR | ||
28 | .IP | ||
29 | Bind to IPv6. Default is both. | ||
30 | .PP | ||
31 | |||
32 | .HP | ||
33 | \fB\-D\fR, \fB\-\-daemon\fR | ||
34 | .IP | ||
35 | Run as a daemon process. | ||
36 | .PP | ||
37 | |||
38 | .HP | ||
39 | \fB\-d\fR, \fB\-\-debug\fR | ||
40 | .IP | ||
41 | Print debugging information. | ||
42 | .PP | ||
43 | |||
44 | .HP | ||
45 | \fB\-PFILE\fR, \fB\-\-pid FILE\fR | ||
46 | .IP | ||
47 | Write process id to FILE. | ||
48 | .br | ||
49 | If no FILE specified, use /var/run/usbipd.pid | ||
50 | .PP | ||
51 | |||
52 | \fB\-tPORT\fR, \fB\-\-tcp\-port PORT\fR | ||
53 | .IP | ||
54 | Listen on TCP/IP port PORT. | ||
55 | .PP | ||
56 | |||
57 | \fB\-h\fR, \fB\-\-help\fR | ||
58 | .IP | ||
59 | Print the program help message and exit. | ||
60 | .PP | ||
61 | |||
62 | .HP | ||
63 | \fB\-v\fR, \fB\-\-version\fR | ||
64 | .IP | ||
65 | Show version. | ||
66 | .PP | ||
67 | |||
68 | .SH LIMITATIONS | ||
69 | |||
70 | .B usbipd | ||
71 | offers no authentication or authorization for USB/IP. Any | ||
72 | USB/IP client can connect and use exported devices. | ||
73 | |||
74 | .SH EXAMPLES | ||
75 | |||
76 | server:# modprobe usbip | ||
77 | |||
78 | server:# usbipd -D | ||
79 | - Start usbip daemon. | ||
80 | |||
81 | server:# usbip list --local | ||
82 | - List driver assignments for usb devices. | ||
83 | |||
84 | server:# usbip bind --busid=1-2 | ||
85 | - Bind usbip-host.ko to the device of busid 1-2. | ||
86 | - A usb device 1-2 is now exportable to other hosts! | ||
87 | - Use 'usbip unbind --busid=1-2' when you want to shutdown exporting and use the device locally. | ||
88 | |||
89 | .SH "SEE ALSO" | ||
90 | \fBusbip\fP\fB(8)\fB\fP | ||
91 | |||
diff --git a/drivers/staging/usbip/userspace/libsrc/Makefile.am b/drivers/staging/usbip/userspace/libsrc/Makefile.am deleted file mode 100644 index 7c8f8a4d54e4..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/Makefile.am +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | libusbip_la_CPPFLAGS = -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' | ||
2 | libusbip_la_CFLAGS = @EXTRA_CFLAGS@ | ||
3 | libusbip_la_LDFLAGS = -version-info @LIBUSBIP_VERSION@ | ||
4 | |||
5 | lib_LTLIBRARIES := libusbip.la | ||
6 | libusbip_la_SOURCES := names.c names.h usbip_host_driver.c usbip_host_driver.h \ | ||
7 | usbip_common.c usbip_common.h vhci_driver.c vhci_driver.h \ | ||
8 | sysfs_utils.c sysfs_utils.h | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/list.h b/drivers/staging/usbip/userspace/libsrc/list.h deleted file mode 100644 index 8d0c936e184f..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/list.h +++ /dev/null | |||
@@ -1,136 +0,0 @@ | |||
1 | #ifndef _LIST_H | ||
2 | #define _LIST_H | ||
3 | |||
4 | /* Stripped down implementation of linked list taken | ||
5 | * from the Linux Kernel. | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * Simple doubly linked list implementation. | ||
10 | * | ||
11 | * Some of the internal functions ("__xxx") are useful when | ||
12 | * manipulating whole lists rather than single entries, as | ||
13 | * sometimes we already know the next/prev entries and we can | ||
14 | * generate better code by using them directly rather than | ||
15 | * using the generic single-entry routines. | ||
16 | */ | ||
17 | |||
18 | struct list_head { | ||
19 | struct list_head *next, *prev; | ||
20 | }; | ||
21 | |||
22 | #define LIST_HEAD_INIT(name) { &(name), &(name) } | ||
23 | |||
24 | #define LIST_HEAD(name) \ | ||
25 | struct list_head name = LIST_HEAD_INIT(name) | ||
26 | |||
27 | static inline void INIT_LIST_HEAD(struct list_head *list) | ||
28 | { | ||
29 | list->next = list; | ||
30 | list->prev = list; | ||
31 | } | ||
32 | |||
33 | /* | ||
34 | * Insert a new entry between two known consecutive entries. | ||
35 | * | ||
36 | * This is only for internal list manipulation where we know | ||
37 | * the prev/next entries already! | ||
38 | */ | ||
39 | static inline void __list_add(struct list_head *new, | ||
40 | struct list_head *prev, | ||
41 | struct list_head *next) | ||
42 | { | ||
43 | next->prev = new; | ||
44 | new->next = next; | ||
45 | new->prev = prev; | ||
46 | prev->next = new; | ||
47 | } | ||
48 | |||
49 | /** | ||
50 | * list_add - add a new entry | ||
51 | * @new: new entry to be added | ||
52 | * @head: list head to add it after | ||
53 | * | ||
54 | * Insert a new entry after the specified head. | ||
55 | * This is good for implementing stacks. | ||
56 | */ | ||
57 | static inline void list_add(struct list_head *new, struct list_head *head) | ||
58 | { | ||
59 | __list_add(new, head, head->next); | ||
60 | } | ||
61 | |||
62 | /* | ||
63 | * Delete a list entry by making the prev/next entries | ||
64 | * point to each other. | ||
65 | * | ||
66 | * This is only for internal list manipulation where we know | ||
67 | * the prev/next entries already! | ||
68 | */ | ||
69 | static inline void __list_del(struct list_head * prev, struct list_head * next) | ||
70 | { | ||
71 | next->prev = prev; | ||
72 | prev->next = next; | ||
73 | } | ||
74 | |||
75 | #define POISON_POINTER_DELTA 0 | ||
76 | #define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) | ||
77 | #define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) | ||
78 | |||
79 | /** | ||
80 | * list_del - deletes entry from list. | ||
81 | * @entry: the element to delete from the list. | ||
82 | * Note: list_empty() on entry does not return true after this, the entry is | ||
83 | * in an undefined state. | ||
84 | */ | ||
85 | static inline void __list_del_entry(struct list_head *entry) | ||
86 | { | ||
87 | __list_del(entry->prev, entry->next); | ||
88 | } | ||
89 | |||
90 | static inline void list_del(struct list_head *entry) | ||
91 | { | ||
92 | __list_del(entry->prev, entry->next); | ||
93 | entry->next = LIST_POISON1; | ||
94 | entry->prev = LIST_POISON2; | ||
95 | } | ||
96 | |||
97 | /** | ||
98 | * list_entry - get the struct for this entry | ||
99 | * @ptr: the &struct list_head pointer. | ||
100 | * @type: the type of the struct this is embedded in. | ||
101 | * @member: the name of the list_struct within the struct. | ||
102 | */ | ||
103 | #define list_entry(ptr, type, member) \ | ||
104 | container_of(ptr, type, member) | ||
105 | /** | ||
106 | * list_for_each - iterate over a list | ||
107 | * @pos: the &struct list_head to use as a loop cursor. | ||
108 | * @head: the head for your list. | ||
109 | */ | ||
110 | #define list_for_each(pos, head) \ | ||
111 | for (pos = (head)->next; pos != (head); pos = pos->next) | ||
112 | |||
113 | /** | ||
114 | * list_for_each_safe - iterate over a list safe against removal of list entry | ||
115 | * @pos: the &struct list_head to use as a loop cursor. | ||
116 | * @n: another &struct list_head to use as temporary storage | ||
117 | * @head: the head for your list. | ||
118 | */ | ||
119 | #define list_for_each_safe(pos, n, head) \ | ||
120 | for (pos = (head)->next, n = pos->next; pos != (head); \ | ||
121 | pos = n, n = pos->next) | ||
122 | |||
123 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) | ||
124 | |||
125 | /** | ||
126 | * container_of - cast a member of a structure out to the containing structure | ||
127 | * @ptr: the pointer to the member. | ||
128 | * @type: the type of the container struct this is embedded in. | ||
129 | * @member: the name of the member within the struct. | ||
130 | * | ||
131 | */ | ||
132 | #define container_of(ptr, type, member) ({ \ | ||
133 | const typeof( ((type *)0)->member ) *__mptr = (ptr); \ | ||
134 | (type *)( (char *)__mptr - offsetof(type,member) );}) | ||
135 | |||
136 | #endif | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/names.c b/drivers/staging/usbip/userspace/libsrc/names.c deleted file mode 100644 index 81ff8522405c..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/names.c +++ /dev/null | |||
@@ -1,504 +0,0 @@ | |||
1 | /* | ||
2 | * names.c -- USB name database manipulation routines | ||
3 | * | ||
4 | * Copyright (C) 1999, 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * | ||
20 | * | ||
21 | * | ||
22 | * | ||
23 | * | ||
24 | * Copyright (C) 2005 Takahiro Hirofuchi | ||
25 | * - names_deinit() is added. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | #include <sys/types.h> | ||
30 | #include <sys/stat.h> | ||
31 | #include <fcntl.h> | ||
32 | #include <dirent.h> | ||
33 | #include <string.h> | ||
34 | #include <errno.h> | ||
35 | #include <stdlib.h> | ||
36 | #include <unistd.h> | ||
37 | #include <stdio.h> | ||
38 | #include <ctype.h> | ||
39 | |||
40 | #include "names.h" | ||
41 | #include "usbip_common.h" | ||
42 | |||
43 | struct vendor { | ||
44 | struct vendor *next; | ||
45 | u_int16_t vendorid; | ||
46 | char name[1]; | ||
47 | }; | ||
48 | |||
49 | struct product { | ||
50 | struct product *next; | ||
51 | u_int16_t vendorid, productid; | ||
52 | char name[1]; | ||
53 | }; | ||
54 | |||
55 | struct class { | ||
56 | struct class *next; | ||
57 | u_int8_t classid; | ||
58 | char name[1]; | ||
59 | }; | ||
60 | |||
61 | struct subclass { | ||
62 | struct subclass *next; | ||
63 | u_int8_t classid, subclassid; | ||
64 | char name[1]; | ||
65 | }; | ||
66 | |||
67 | struct protocol { | ||
68 | struct protocol *next; | ||
69 | u_int8_t classid, subclassid, protocolid; | ||
70 | char name[1]; | ||
71 | }; | ||
72 | |||
73 | struct genericstrtable { | ||
74 | struct genericstrtable *next; | ||
75 | unsigned int num; | ||
76 | char name[1]; | ||
77 | }; | ||
78 | |||
79 | |||
80 | #define HASH1 0x10 | ||
81 | #define HASH2 0x02 | ||
82 | #define HASHSZ 16 | ||
83 | |||
84 | static unsigned int hashnum(unsigned int num) | ||
85 | { | ||
86 | unsigned int mask1 = HASH1 << 27, mask2 = HASH2 << 27; | ||
87 | |||
88 | for (; mask1 >= HASH1; mask1 >>= 1, mask2 >>= 1) | ||
89 | if (num & mask1) | ||
90 | num ^= mask2; | ||
91 | return num & (HASHSZ-1); | ||
92 | } | ||
93 | |||
94 | |||
95 | static struct vendor *vendors[HASHSZ] = { NULL, }; | ||
96 | static struct product *products[HASHSZ] = { NULL, }; | ||
97 | static struct class *classes[HASHSZ] = { NULL, }; | ||
98 | static struct subclass *subclasses[HASHSZ] = { NULL, }; | ||
99 | static struct protocol *protocols[HASHSZ] = { NULL, }; | ||
100 | |||
101 | const char *names_vendor(u_int16_t vendorid) | ||
102 | { | ||
103 | struct vendor *v; | ||
104 | |||
105 | v = vendors[hashnum(vendorid)]; | ||
106 | for (; v; v = v->next) | ||
107 | if (v->vendorid == vendorid) | ||
108 | return v->name; | ||
109 | return NULL; | ||
110 | } | ||
111 | |||
112 | const char *names_product(u_int16_t vendorid, u_int16_t productid) | ||
113 | { | ||
114 | struct product *p; | ||
115 | |||
116 | p = products[hashnum((vendorid << 16) | productid)]; | ||
117 | for (; p; p = p->next) | ||
118 | if (p->vendorid == vendorid && p->productid == productid) | ||
119 | return p->name; | ||
120 | return NULL; | ||
121 | } | ||
122 | |||
123 | const char *names_class(u_int8_t classid) | ||
124 | { | ||
125 | struct class *c; | ||
126 | |||
127 | c = classes[hashnum(classid)]; | ||
128 | for (; c; c = c->next) | ||
129 | if (c->classid == classid) | ||
130 | return c->name; | ||
131 | return NULL; | ||
132 | } | ||
133 | |||
134 | const char *names_subclass(u_int8_t classid, u_int8_t subclassid) | ||
135 | { | ||
136 | struct subclass *s; | ||
137 | |||
138 | s = subclasses[hashnum((classid << 8) | subclassid)]; | ||
139 | for (; s; s = s->next) | ||
140 | if (s->classid == classid && s->subclassid == subclassid) | ||
141 | return s->name; | ||
142 | return NULL; | ||
143 | } | ||
144 | |||
145 | const char *names_protocol(u_int8_t classid, u_int8_t subclassid, | ||
146 | u_int8_t protocolid) | ||
147 | { | ||
148 | struct protocol *p; | ||
149 | |||
150 | p = protocols[hashnum((classid << 16) | (subclassid << 8) | ||
151 | | protocolid)]; | ||
152 | for (; p; p = p->next) | ||
153 | if (p->classid == classid && p->subclassid == subclassid && | ||
154 | p->protocolid == protocolid) | ||
155 | return p->name; | ||
156 | return NULL; | ||
157 | } | ||
158 | |||
159 | /* add a cleanup function by takahiro */ | ||
160 | struct pool { | ||
161 | struct pool *next; | ||
162 | void *mem; | ||
163 | }; | ||
164 | |||
165 | static struct pool *pool_head; | ||
166 | |||
167 | static void *my_malloc(size_t size) | ||
168 | { | ||
169 | struct pool *p; | ||
170 | |||
171 | p = calloc(1, sizeof(struct pool)); | ||
172 | if (!p) | ||
173 | return NULL; | ||
174 | |||
175 | p->mem = calloc(1, size); | ||
176 | if (!p->mem) { | ||
177 | free(p); | ||
178 | return NULL; | ||
179 | } | ||
180 | |||
181 | p->next = pool_head; | ||
182 | pool_head = p; | ||
183 | |||
184 | return p->mem; | ||
185 | } | ||
186 | |||
187 | void names_free(void) | ||
188 | { | ||
189 | struct pool *pool; | ||
190 | |||
191 | if (!pool_head) | ||
192 | return; | ||
193 | |||
194 | for (pool = pool_head; pool != NULL; ) { | ||
195 | struct pool *tmp; | ||
196 | |||
197 | if (pool->mem) | ||
198 | free(pool->mem); | ||
199 | |||
200 | tmp = pool; | ||
201 | pool = pool->next; | ||
202 | free(tmp); | ||
203 | } | ||
204 | } | ||
205 | |||
206 | static int new_vendor(const char *name, u_int16_t vendorid) | ||
207 | { | ||
208 | struct vendor *v; | ||
209 | unsigned int h = hashnum(vendorid); | ||
210 | |||
211 | v = vendors[h]; | ||
212 | for (; v; v = v->next) | ||
213 | if (v->vendorid == vendorid) | ||
214 | return -1; | ||
215 | v = my_malloc(sizeof(struct vendor) + strlen(name)); | ||
216 | if (!v) | ||
217 | return -1; | ||
218 | strcpy(v->name, name); | ||
219 | v->vendorid = vendorid; | ||
220 | v->next = vendors[h]; | ||
221 | vendors[h] = v; | ||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | static int new_product(const char *name, u_int16_t vendorid, | ||
226 | u_int16_t productid) | ||
227 | { | ||
228 | struct product *p; | ||
229 | unsigned int h = hashnum((vendorid << 16) | productid); | ||
230 | |||
231 | p = products[h]; | ||
232 | for (; p; p = p->next) | ||
233 | if (p->vendorid == vendorid && p->productid == productid) | ||
234 | return -1; | ||
235 | p = my_malloc(sizeof(struct product) + strlen(name)); | ||
236 | if (!p) | ||
237 | return -1; | ||
238 | strcpy(p->name, name); | ||
239 | p->vendorid = vendorid; | ||
240 | p->productid = productid; | ||
241 | p->next = products[h]; | ||
242 | products[h] = p; | ||
243 | return 0; | ||
244 | } | ||
245 | |||
246 | static int new_class(const char *name, u_int8_t classid) | ||
247 | { | ||
248 | struct class *c; | ||
249 | unsigned int h = hashnum(classid); | ||
250 | |||
251 | c = classes[h]; | ||
252 | for (; c; c = c->next) | ||
253 | if (c->classid == classid) | ||
254 | return -1; | ||
255 | c = my_malloc(sizeof(struct class) + strlen(name)); | ||
256 | if (!c) | ||
257 | return -1; | ||
258 | strcpy(c->name, name); | ||
259 | c->classid = classid; | ||
260 | c->next = classes[h]; | ||
261 | classes[h] = c; | ||
262 | return 0; | ||
263 | } | ||
264 | |||
265 | static int new_subclass(const char *name, u_int8_t classid, u_int8_t subclassid) | ||
266 | { | ||
267 | struct subclass *s; | ||
268 | unsigned int h = hashnum((classid << 8) | subclassid); | ||
269 | |||
270 | s = subclasses[h]; | ||
271 | for (; s; s = s->next) | ||
272 | if (s->classid == classid && s->subclassid == subclassid) | ||
273 | return -1; | ||
274 | s = my_malloc(sizeof(struct subclass) + strlen(name)); | ||
275 | if (!s) | ||
276 | return -1; | ||
277 | strcpy(s->name, name); | ||
278 | s->classid = classid; | ||
279 | s->subclassid = subclassid; | ||
280 | s->next = subclasses[h]; | ||
281 | subclasses[h] = s; | ||
282 | return 0; | ||
283 | } | ||
284 | |||
285 | static int new_protocol(const char *name, u_int8_t classid, u_int8_t subclassid, | ||
286 | u_int8_t protocolid) | ||
287 | { | ||
288 | struct protocol *p; | ||
289 | unsigned int h = hashnum((classid << 16) | (subclassid << 8) | ||
290 | | protocolid); | ||
291 | |||
292 | p = protocols[h]; | ||
293 | for (; p; p = p->next) | ||
294 | if (p->classid == classid && p->subclassid == subclassid | ||
295 | && p->protocolid == protocolid) | ||
296 | return -1; | ||
297 | p = my_malloc(sizeof(struct protocol) + strlen(name)); | ||
298 | if (!p) | ||
299 | return -1; | ||
300 | strcpy(p->name, name); | ||
301 | p->classid = classid; | ||
302 | p->subclassid = subclassid; | ||
303 | p->protocolid = protocolid; | ||
304 | p->next = protocols[h]; | ||
305 | protocols[h] = p; | ||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | static void parse(FILE *f) | ||
310 | { | ||
311 | char buf[512], *cp; | ||
312 | unsigned int linectr = 0; | ||
313 | int lastvendor = -1; | ||
314 | int lastclass = -1; | ||
315 | int lastsubclass = -1; | ||
316 | int lasthut = -1; | ||
317 | int lastlang = -1; | ||
318 | unsigned int u; | ||
319 | |||
320 | while (fgets(buf, sizeof(buf), f)) { | ||
321 | linectr++; | ||
322 | /* remove line ends */ | ||
323 | cp = strchr(buf, '\r'); | ||
324 | if (cp) | ||
325 | *cp = 0; | ||
326 | cp = strchr(buf, '\n'); | ||
327 | if (cp) | ||
328 | *cp = 0; | ||
329 | if (buf[0] == '#' || !buf[0]) | ||
330 | continue; | ||
331 | cp = buf; | ||
332 | if (buf[0] == 'P' && buf[1] == 'H' && buf[2] == 'Y' && | ||
333 | buf[3] == 'S' && buf[4] == 'D' && | ||
334 | buf[5] == 'E' && buf[6] == 'S' && /*isspace(buf[7])*/ | ||
335 | buf[7] == ' ') { | ||
336 | continue; | ||
337 | } | ||
338 | if (buf[0] == 'P' && buf[1] == 'H' && | ||
339 | buf[2] == 'Y' && /*isspace(buf[3])*/ buf[3] == ' ') { | ||
340 | continue; | ||
341 | } | ||
342 | if (buf[0] == 'B' && buf[1] == 'I' && buf[2] == 'A' && | ||
343 | buf[3] == 'S' && /*isspace(buf[4])*/ buf[4] == ' ') { | ||
344 | continue; | ||
345 | } | ||
346 | if (buf[0] == 'L' && /*isspace(buf[1])*/ buf[1] == ' ') { | ||
347 | lasthut = lastclass = lastvendor = lastsubclass = -1; | ||
348 | /* | ||
349 | * set 1 as pseudo-id to indicate that the parser is | ||
350 | * in a `L' section. | ||
351 | */ | ||
352 | lastlang = 1; | ||
353 | continue; | ||
354 | } | ||
355 | if (buf[0] == 'C' && /*isspace(buf[1])*/ buf[1] == ' ') { | ||
356 | /* class spec */ | ||
357 | cp = buf+2; | ||
358 | while (isspace(*cp)) | ||
359 | cp++; | ||
360 | if (!isxdigit(*cp)) { | ||
361 | err("Invalid class spec at line %u", linectr); | ||
362 | continue; | ||
363 | } | ||
364 | u = strtoul(cp, &cp, 16); | ||
365 | while (isspace(*cp)) | ||
366 | cp++; | ||
367 | if (!*cp) { | ||
368 | err("Invalid class spec at line %u", linectr); | ||
369 | continue; | ||
370 | } | ||
371 | if (new_class(cp, u)) | ||
372 | err("Duplicate class spec at line %u class %04x %s", | ||
373 | linectr, u, cp); | ||
374 | dbg("line %5u class %02x %s", linectr, u, cp); | ||
375 | lasthut = lastlang = lastvendor = lastsubclass = -1; | ||
376 | lastclass = u; | ||
377 | continue; | ||
378 | } | ||
379 | if (buf[0] == 'A' && buf[1] == 'T' && isspace(buf[2])) { | ||
380 | /* audio terminal type spec */ | ||
381 | continue; | ||
382 | } | ||
383 | if (buf[0] == 'H' && buf[1] == 'C' && buf[2] == 'C' | ||
384 | && isspace(buf[3])) { | ||
385 | /* HID Descriptor bCountryCode */ | ||
386 | continue; | ||
387 | } | ||
388 | if (isxdigit(*cp)) { | ||
389 | /* vendor */ | ||
390 | u = strtoul(cp, &cp, 16); | ||
391 | while (isspace(*cp)) | ||
392 | cp++; | ||
393 | if (!*cp) { | ||
394 | err("Invalid vendor spec at line %u", linectr); | ||
395 | continue; | ||
396 | } | ||
397 | if (new_vendor(cp, u)) | ||
398 | err("Duplicate vendor spec at line %u vendor %04x %s", | ||
399 | linectr, u, cp); | ||
400 | dbg("line %5u vendor %04x %s", linectr, u, cp); | ||
401 | lastvendor = u; | ||
402 | lasthut = lastlang = lastclass = lastsubclass = -1; | ||
403 | continue; | ||
404 | } | ||
405 | if (buf[0] == '\t' && isxdigit(buf[1])) { | ||
406 | /* product or subclass spec */ | ||
407 | u = strtoul(buf+1, &cp, 16); | ||
408 | while (isspace(*cp)) | ||
409 | cp++; | ||
410 | if (!*cp) { | ||
411 | err("Invalid product/subclass spec at line %u", | ||
412 | linectr); | ||
413 | continue; | ||
414 | } | ||
415 | if (lastvendor != -1) { | ||
416 | if (new_product(cp, lastvendor, u)) | ||
417 | err("Duplicate product spec at line %u product %04x:%04x %s", | ||
418 | linectr, lastvendor, u, cp); | ||
419 | dbg("line %5u product %04x:%04x %s", linectr, | ||
420 | lastvendor, u, cp); | ||
421 | continue; | ||
422 | } | ||
423 | if (lastclass != -1) { | ||
424 | if (new_subclass(cp, lastclass, u)) | ||
425 | err("Duplicate subclass spec at line %u class %02x:%02x %s", | ||
426 | linectr, lastclass, u, cp); | ||
427 | dbg("line %5u subclass %02x:%02x %s", linectr, | ||
428 | lastclass, u, cp); | ||
429 | lastsubclass = u; | ||
430 | continue; | ||
431 | } | ||
432 | if (lasthut != -1) { | ||
433 | /* do not store hut */ | ||
434 | continue; | ||
435 | } | ||
436 | if (lastlang != -1) { | ||
437 | /* do not store langid */ | ||
438 | continue; | ||
439 | } | ||
440 | err("Product/Subclass spec without prior Vendor/Class spec at line %u", | ||
441 | linectr); | ||
442 | continue; | ||
443 | } | ||
444 | if (buf[0] == '\t' && buf[1] == '\t' && isxdigit(buf[2])) { | ||
445 | /* protocol spec */ | ||
446 | u = strtoul(buf+2, &cp, 16); | ||
447 | while (isspace(*cp)) | ||
448 | cp++; | ||
449 | if (!*cp) { | ||
450 | err("Invalid protocol spec at line %u", | ||
451 | linectr); | ||
452 | continue; | ||
453 | } | ||
454 | if (lastclass != -1 && lastsubclass != -1) { | ||
455 | if (new_protocol(cp, lastclass, lastsubclass, | ||
456 | u)) | ||
457 | err("Duplicate protocol spec at line %u class %02x:%02x:%02x %s", | ||
458 | linectr, lastclass, lastsubclass, | ||
459 | u, cp); | ||
460 | dbg("line %5u protocol %02x:%02x:%02x %s", | ||
461 | linectr, lastclass, lastsubclass, u, cp); | ||
462 | continue; | ||
463 | } | ||
464 | err("Protocol spec without prior Class and Subclass spec at line %u", | ||
465 | linectr); | ||
466 | continue; | ||
467 | } | ||
468 | if (buf[0] == 'H' && buf[1] == 'I' && | ||
469 | buf[2] == 'D' && /*isspace(buf[3])*/ buf[3] == ' ') { | ||
470 | continue; | ||
471 | } | ||
472 | if (buf[0] == 'H' && buf[1] == 'U' && | ||
473 | buf[2] == 'T' && /*isspace(buf[3])*/ buf[3] == ' ') { | ||
474 | lastlang = lastclass = lastvendor = lastsubclass = -1; | ||
475 | /* | ||
476 | * set 1 as pseudo-id to indicate that the parser is | ||
477 | * in a `HUT' section. | ||
478 | */ | ||
479 | lasthut = 1; | ||
480 | continue; | ||
481 | } | ||
482 | if (buf[0] == 'R' && buf[1] == ' ') | ||
483 | continue; | ||
484 | |||
485 | if (buf[0] == 'V' && buf[1] == 'T') | ||
486 | continue; | ||
487 | |||
488 | err("Unknown line at line %u", linectr); | ||
489 | } | ||
490 | } | ||
491 | |||
492 | |||
493 | int names_init(char *n) | ||
494 | { | ||
495 | FILE *f; | ||
496 | |||
497 | f = fopen(n, "r"); | ||
498 | if (!f) | ||
499 | return errno; | ||
500 | |||
501 | parse(f); | ||
502 | fclose(f); | ||
503 | return 0; | ||
504 | } | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/names.h b/drivers/staging/usbip/userspace/libsrc/names.h deleted file mode 100644 index 680926512de2..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/names.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | /* | ||
2 | * names.h -- USB name database manipulation routines | ||
3 | * | ||
4 | * Copyright (C) 1999, 2000 Thomas Sailer (sailer@ife.ee.ethz.ch) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | * | ||
20 | * | ||
21 | * | ||
22 | * Copyright (C) 2005 Takahiro Hirofuchi | ||
23 | * - names_free() is added. | ||
24 | */ | ||
25 | |||
26 | #ifndef _NAMES_H | ||
27 | #define _NAMES_H | ||
28 | |||
29 | #include <sys/types.h> | ||
30 | |||
31 | /* used by usbip_common.c */ | ||
32 | extern const char *names_vendor(u_int16_t vendorid); | ||
33 | extern const char *names_product(u_int16_t vendorid, u_int16_t productid); | ||
34 | extern const char *names_class(u_int8_t classid); | ||
35 | extern const char *names_subclass(u_int8_t classid, u_int8_t subclassid); | ||
36 | extern const char *names_protocol(u_int8_t classid, u_int8_t subclassid, | ||
37 | u_int8_t protocolid); | ||
38 | extern int names_init(char *n); | ||
39 | extern void names_free(void); | ||
40 | |||
41 | #endif /* _NAMES_H */ | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/sysfs_utils.c b/drivers/staging/usbip/userspace/libsrc/sysfs_utils.c deleted file mode 100644 index 36ac88ece0b8..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/sysfs_utils.c +++ /dev/null | |||
@@ -1,31 +0,0 @@ | |||
1 | #include <sys/types.h> | ||
2 | #include <sys/stat.h> | ||
3 | #include <fcntl.h> | ||
4 | #include <errno.h> | ||
5 | |||
6 | #include "sysfs_utils.h" | ||
7 | #include "usbip_common.h" | ||
8 | |||
9 | int write_sysfs_attribute(const char *attr_path, const char *new_value, | ||
10 | size_t len) | ||
11 | { | ||
12 | int fd; | ||
13 | int length; | ||
14 | |||
15 | fd = open(attr_path, O_WRONLY); | ||
16 | if (fd < 0) { | ||
17 | dbg("error opening attribute %s", attr_path); | ||
18 | return -1; | ||
19 | } | ||
20 | |||
21 | length = write(fd, new_value, len); | ||
22 | if (length < 0) { | ||
23 | dbg("error writing to attribute %s", attr_path); | ||
24 | close(fd); | ||
25 | return -1; | ||
26 | } | ||
27 | |||
28 | close(fd); | ||
29 | |||
30 | return 0; | ||
31 | } | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/sysfs_utils.h b/drivers/staging/usbip/userspace/libsrc/sysfs_utils.h deleted file mode 100644 index 32ac1d105d18..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/sysfs_utils.h +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | |||
2 | #ifndef __SYSFS_UTILS_H | ||
3 | #define __SYSFS_UTILS_H | ||
4 | |||
5 | int write_sysfs_attribute(const char *attr_path, const char *new_value, | ||
6 | size_t len); | ||
7 | |||
8 | #endif | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/usbip_common.c b/drivers/staging/usbip/userspace/libsrc/usbip_common.c deleted file mode 100644 index ac73710473de..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/usbip_common.c +++ /dev/null | |||
@@ -1,285 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2007 Takahiro Hirofuchi | ||
3 | */ | ||
4 | |||
5 | #include <libudev.h> | ||
6 | #include "usbip_common.h" | ||
7 | #include "names.h" | ||
8 | |||
9 | #undef PROGNAME | ||
10 | #define PROGNAME "libusbip" | ||
11 | |||
12 | int usbip_use_syslog; | ||
13 | int usbip_use_stderr; | ||
14 | int usbip_use_debug; | ||
15 | |||
16 | extern struct udev *udev_context; | ||
17 | |||
18 | struct speed_string { | ||
19 | int num; | ||
20 | char *speed; | ||
21 | char *desc; | ||
22 | }; | ||
23 | |||
24 | static const struct speed_string speed_strings[] = { | ||
25 | { USB_SPEED_UNKNOWN, "unknown", "Unknown Speed"}, | ||
26 | { USB_SPEED_LOW, "1.5", "Low Speed(1.5Mbps)" }, | ||
27 | { USB_SPEED_FULL, "12", "Full Speed(12Mbps)" }, | ||
28 | { USB_SPEED_HIGH, "480", "High Speed(480Mbps)" }, | ||
29 | { USB_SPEED_WIRELESS, "53.3-480", "Wireless"}, | ||
30 | { USB_SPEED_SUPER, "5000", "Super Speed(5000Mbps)" }, | ||
31 | { 0, NULL, NULL } | ||
32 | }; | ||
33 | |||
34 | struct portst_string { | ||
35 | int num; | ||
36 | char *desc; | ||
37 | }; | ||
38 | |||
39 | static struct portst_string portst_strings[] = { | ||
40 | { SDEV_ST_AVAILABLE, "Device Available" }, | ||
41 | { SDEV_ST_USED, "Device in Use" }, | ||
42 | { SDEV_ST_ERROR, "Device Error"}, | ||
43 | { VDEV_ST_NULL, "Port Available"}, | ||
44 | { VDEV_ST_NOTASSIGNED, "Port Initializing"}, | ||
45 | { VDEV_ST_USED, "Port in Use"}, | ||
46 | { VDEV_ST_ERROR, "Port Error"}, | ||
47 | { 0, NULL} | ||
48 | }; | ||
49 | |||
50 | const char *usbip_status_string(int32_t status) | ||
51 | { | ||
52 | for (int i = 0; portst_strings[i].desc != NULL; i++) | ||
53 | if (portst_strings[i].num == status) | ||
54 | return portst_strings[i].desc; | ||
55 | |||
56 | return "Unknown Status"; | ||
57 | } | ||
58 | |||
59 | const char *usbip_speed_string(int num) | ||
60 | { | ||
61 | for (int i = 0; speed_strings[i].speed != NULL; i++) | ||
62 | if (speed_strings[i].num == num) | ||
63 | return speed_strings[i].desc; | ||
64 | |||
65 | return "Unknown Speed"; | ||
66 | } | ||
67 | |||
68 | |||
69 | #define DBG_UDEV_INTEGER(name)\ | ||
70 | dbg("%-20s = %x", to_string(name), (int) udev->name) | ||
71 | |||
72 | #define DBG_UINF_INTEGER(name)\ | ||
73 | dbg("%-20s = %x", to_string(name), (int) uinf->name) | ||
74 | |||
75 | void dump_usb_interface(struct usbip_usb_interface *uinf) | ||
76 | { | ||
77 | char buff[100]; | ||
78 | |||
79 | usbip_names_get_class(buff, sizeof(buff), | ||
80 | uinf->bInterfaceClass, | ||
81 | uinf->bInterfaceSubClass, | ||
82 | uinf->bInterfaceProtocol); | ||
83 | dbg("%-20s = %s", "Interface(C/SC/P)", buff); | ||
84 | } | ||
85 | |||
86 | void dump_usb_device(struct usbip_usb_device *udev) | ||
87 | { | ||
88 | char buff[100]; | ||
89 | |||
90 | dbg("%-20s = %s", "path", udev->path); | ||
91 | dbg("%-20s = %s", "busid", udev->busid); | ||
92 | |||
93 | usbip_names_get_class(buff, sizeof(buff), | ||
94 | udev->bDeviceClass, | ||
95 | udev->bDeviceSubClass, | ||
96 | udev->bDeviceProtocol); | ||
97 | dbg("%-20s = %s", "Device(C/SC/P)", buff); | ||
98 | |||
99 | DBG_UDEV_INTEGER(bcdDevice); | ||
100 | |||
101 | usbip_names_get_product(buff, sizeof(buff), | ||
102 | udev->idVendor, | ||
103 | udev->idProduct); | ||
104 | dbg("%-20s = %s", "Vendor/Product", buff); | ||
105 | |||
106 | DBG_UDEV_INTEGER(bNumConfigurations); | ||
107 | DBG_UDEV_INTEGER(bNumInterfaces); | ||
108 | |||
109 | dbg("%-20s = %s", "speed", | ||
110 | usbip_speed_string(udev->speed)); | ||
111 | |||
112 | DBG_UDEV_INTEGER(busnum); | ||
113 | DBG_UDEV_INTEGER(devnum); | ||
114 | } | ||
115 | |||
116 | |||
117 | int read_attr_value(struct udev_device *dev, const char *name, | ||
118 | const char *format) | ||
119 | { | ||
120 | const char *attr; | ||
121 | int num = 0; | ||
122 | int ret; | ||
123 | |||
124 | attr = udev_device_get_sysattr_value(dev, name); | ||
125 | if (!attr) { | ||
126 | err("udev_device_get_sysattr_value failed"); | ||
127 | goto err; | ||
128 | } | ||
129 | |||
130 | /* The client chooses the device configuration | ||
131 | * when attaching it so right after being bound | ||
132 | * to usbip-host on the server the device will | ||
133 | * have no configuration. | ||
134 | * Therefore, attributes such as bConfigurationValue | ||
135 | * and bNumInterfaces will not exist and sscanf will | ||
136 | * fail. Check for these cases and don't treat them | ||
137 | * as errors. | ||
138 | */ | ||
139 | |||
140 | ret = sscanf(attr, format, &num); | ||
141 | if (ret < 1) { | ||
142 | if (strcmp(name, "bConfigurationValue") && | ||
143 | strcmp(name, "bNumInterfaces")) { | ||
144 | err("sscanf failed for attribute %s", name); | ||
145 | goto err; | ||
146 | } | ||
147 | } | ||
148 | |||
149 | err: | ||
150 | |||
151 | return num; | ||
152 | } | ||
153 | |||
154 | |||
155 | int read_attr_speed(struct udev_device *dev) | ||
156 | { | ||
157 | const char *speed; | ||
158 | |||
159 | speed = udev_device_get_sysattr_value(dev, "speed"); | ||
160 | if (!speed) { | ||
161 | err("udev_device_get_sysattr_value failed"); | ||
162 | goto err; | ||
163 | } | ||
164 | |||
165 | for (int i = 0; speed_strings[i].speed != NULL; i++) { | ||
166 | if (!strcmp(speed, speed_strings[i].speed)) | ||
167 | return speed_strings[i].num; | ||
168 | } | ||
169 | |||
170 | err: | ||
171 | |||
172 | return USB_SPEED_UNKNOWN; | ||
173 | } | ||
174 | |||
175 | #define READ_ATTR(object, type, dev, name, format) \ | ||
176 | do { \ | ||
177 | (object)->name = (type) read_attr_value(dev, to_string(name), \ | ||
178 | format); \ | ||
179 | } while (0) | ||
180 | |||
181 | |||
182 | int read_usb_device(struct udev_device *sdev, struct usbip_usb_device *udev) | ||
183 | { | ||
184 | uint32_t busnum, devnum; | ||
185 | const char *path, *name; | ||
186 | |||
187 | READ_ATTR(udev, uint8_t, sdev, bDeviceClass, "%02x\n"); | ||
188 | READ_ATTR(udev, uint8_t, sdev, bDeviceSubClass, "%02x\n"); | ||
189 | READ_ATTR(udev, uint8_t, sdev, bDeviceProtocol, "%02x\n"); | ||
190 | |||
191 | READ_ATTR(udev, uint16_t, sdev, idVendor, "%04x\n"); | ||
192 | READ_ATTR(udev, uint16_t, sdev, idProduct, "%04x\n"); | ||
193 | READ_ATTR(udev, uint16_t, sdev, bcdDevice, "%04x\n"); | ||
194 | |||
195 | READ_ATTR(udev, uint8_t, sdev, bConfigurationValue, "%02x\n"); | ||
196 | READ_ATTR(udev, uint8_t, sdev, bNumConfigurations, "%02x\n"); | ||
197 | READ_ATTR(udev, uint8_t, sdev, bNumInterfaces, "%02x\n"); | ||
198 | |||
199 | READ_ATTR(udev, uint8_t, sdev, devnum, "%d\n"); | ||
200 | udev->speed = read_attr_speed(sdev); | ||
201 | |||
202 | path = udev_device_get_syspath(sdev); | ||
203 | name = udev_device_get_sysname(sdev); | ||
204 | |||
205 | strncpy(udev->path, path, SYSFS_PATH_MAX); | ||
206 | strncpy(udev->busid, name, SYSFS_BUS_ID_SIZE); | ||
207 | |||
208 | sscanf(name, "%u-%u", &busnum, &devnum); | ||
209 | udev->busnum = busnum; | ||
210 | |||
211 | return 0; | ||
212 | } | ||
213 | |||
214 | int read_usb_interface(struct usbip_usb_device *udev, int i, | ||
215 | struct usbip_usb_interface *uinf) | ||
216 | { | ||
217 | char busid[SYSFS_BUS_ID_SIZE]; | ||
218 | struct udev_device *sif; | ||
219 | |||
220 | sprintf(busid, "%s:%d.%d", udev->busid, udev->bConfigurationValue, i); | ||
221 | |||
222 | sif = udev_device_new_from_subsystem_sysname(udev_context, "usb", busid); | ||
223 | if (!sif) { | ||
224 | err("udev_device_new_from_subsystem_sysname %s failed", busid); | ||
225 | return -1; | ||
226 | } | ||
227 | |||
228 | READ_ATTR(uinf, uint8_t, sif, bInterfaceClass, "%02x\n"); | ||
229 | READ_ATTR(uinf, uint8_t, sif, bInterfaceSubClass, "%02x\n"); | ||
230 | READ_ATTR(uinf, uint8_t, sif, bInterfaceProtocol, "%02x\n"); | ||
231 | |||
232 | return 0; | ||
233 | } | ||
234 | |||
235 | int usbip_names_init(char *f) | ||
236 | { | ||
237 | return names_init(f); | ||
238 | } | ||
239 | |||
240 | void usbip_names_free(void) | ||
241 | { | ||
242 | names_free(); | ||
243 | } | ||
244 | |||
245 | void usbip_names_get_product(char *buff, size_t size, uint16_t vendor, | ||
246 | uint16_t product) | ||
247 | { | ||
248 | const char *prod, *vend; | ||
249 | |||
250 | prod = names_product(vendor, product); | ||
251 | if (!prod) | ||
252 | prod = "unknown product"; | ||
253 | |||
254 | |||
255 | vend = names_vendor(vendor); | ||
256 | if (!vend) | ||
257 | vend = "unknown vendor"; | ||
258 | |||
259 | snprintf(buff, size, "%s : %s (%04x:%04x)", vend, prod, vendor, product); | ||
260 | } | ||
261 | |||
262 | void usbip_names_get_class(char *buff, size_t size, uint8_t class, | ||
263 | uint8_t subclass, uint8_t protocol) | ||
264 | { | ||
265 | const char *c, *s, *p; | ||
266 | |||
267 | if (class == 0 && subclass == 0 && protocol == 0) { | ||
268 | snprintf(buff, size, "(Defined at Interface level) (%02x/%02x/%02x)", class, subclass, protocol); | ||
269 | return; | ||
270 | } | ||
271 | |||
272 | p = names_protocol(class, subclass, protocol); | ||
273 | if (!p) | ||
274 | p = "unknown protocol"; | ||
275 | |||
276 | s = names_subclass(class, subclass); | ||
277 | if (!s) | ||
278 | s = "unknown subclass"; | ||
279 | |||
280 | c = names_class(class); | ||
281 | if (!c) | ||
282 | c = "unknown class"; | ||
283 | |||
284 | snprintf(buff, size, "%s / %s / %s (%02x/%02x/%02x)", c, s, p, class, subclass, protocol); | ||
285 | } | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/usbip_common.h b/drivers/staging/usbip/userspace/libsrc/usbip_common.h deleted file mode 100644 index 5a0e95edf4df..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/usbip_common.h +++ /dev/null | |||
@@ -1,137 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2007 Takahiro Hirofuchi | ||
3 | */ | ||
4 | |||
5 | #ifndef __USBIP_COMMON_H | ||
6 | #define __USBIP_COMMON_H | ||
7 | |||
8 | #include <libudev.h> | ||
9 | |||
10 | #include <stdint.h> | ||
11 | #include <stdio.h> | ||
12 | #include <stdlib.h> | ||
13 | #include <string.h> | ||
14 | |||
15 | #include <syslog.h> | ||
16 | #include <unistd.h> | ||
17 | #include <linux/usb/ch9.h> | ||
18 | #include "../../uapi/usbip.h" | ||
19 | |||
20 | #ifndef USBIDS_FILE | ||
21 | #define USBIDS_FILE "/usr/share/hwdata/usb.ids" | ||
22 | #endif | ||
23 | |||
24 | #ifndef VHCI_STATE_PATH | ||
25 | #define VHCI_STATE_PATH "/var/run/vhci_hcd" | ||
26 | #endif | ||
27 | |||
28 | /* kernel module names */ | ||
29 | #define USBIP_CORE_MOD_NAME "usbip-core" | ||
30 | #define USBIP_HOST_DRV_NAME "usbip-host" | ||
31 | #define USBIP_VHCI_DRV_NAME "vhci_hcd" | ||
32 | |||
33 | /* sysfs constants */ | ||
34 | #define SYSFS_MNT_PATH "/sys" | ||
35 | #define SYSFS_BUS_NAME "bus" | ||
36 | #define SYSFS_BUS_TYPE "usb" | ||
37 | #define SYSFS_DRIVERS_NAME "drivers" | ||
38 | |||
39 | #define SYSFS_PATH_MAX 256 | ||
40 | #define SYSFS_BUS_ID_SIZE 32 | ||
41 | |||
42 | extern int usbip_use_syslog; | ||
43 | extern int usbip_use_stderr; | ||
44 | extern int usbip_use_debug ; | ||
45 | |||
46 | #define PROGNAME "usbip" | ||
47 | |||
48 | #define pr_fmt(fmt) "%s: %s: " fmt "\n", PROGNAME | ||
49 | #define dbg_fmt(fmt) pr_fmt("%s:%d:[%s] " fmt), "debug", \ | ||
50 | __FILE__, __LINE__, __func__ | ||
51 | |||
52 | #define err(fmt, args...) \ | ||
53 | do { \ | ||
54 | if (usbip_use_syslog) { \ | ||
55 | syslog(LOG_ERR, pr_fmt(fmt), "error", ##args); \ | ||
56 | } \ | ||
57 | if (usbip_use_stderr) { \ | ||
58 | fprintf(stderr, pr_fmt(fmt), "error", ##args); \ | ||
59 | } \ | ||
60 | } while (0) | ||
61 | |||
62 | #define info(fmt, args...) \ | ||
63 | do { \ | ||
64 | if (usbip_use_syslog) { \ | ||
65 | syslog(LOG_INFO, pr_fmt(fmt), "info", ##args); \ | ||
66 | } \ | ||
67 | if (usbip_use_stderr) { \ | ||
68 | fprintf(stderr, pr_fmt(fmt), "info", ##args); \ | ||
69 | } \ | ||
70 | } while (0) | ||
71 | |||
72 | #define dbg(fmt, args...) \ | ||
73 | do { \ | ||
74 | if (usbip_use_debug) { \ | ||
75 | if (usbip_use_syslog) { \ | ||
76 | syslog(LOG_DEBUG, dbg_fmt(fmt), ##args); \ | ||
77 | } \ | ||
78 | if (usbip_use_stderr) { \ | ||
79 | fprintf(stderr, dbg_fmt(fmt), ##args); \ | ||
80 | } \ | ||
81 | } \ | ||
82 | } while (0) | ||
83 | |||
84 | #define BUG() \ | ||
85 | do { \ | ||
86 | err("sorry, it's a bug!"); \ | ||
87 | abort(); \ | ||
88 | } while (0) | ||
89 | |||
90 | struct usbip_usb_interface { | ||
91 | uint8_t bInterfaceClass; | ||
92 | uint8_t bInterfaceSubClass; | ||
93 | uint8_t bInterfaceProtocol; | ||
94 | uint8_t padding; /* alignment */ | ||
95 | } __attribute__((packed)); | ||
96 | |||
97 | struct usbip_usb_device { | ||
98 | char path[SYSFS_PATH_MAX]; | ||
99 | char busid[SYSFS_BUS_ID_SIZE]; | ||
100 | |||
101 | uint32_t busnum; | ||
102 | uint32_t devnum; | ||
103 | uint32_t speed; | ||
104 | |||
105 | uint16_t idVendor; | ||
106 | uint16_t idProduct; | ||
107 | uint16_t bcdDevice; | ||
108 | |||
109 | uint8_t bDeviceClass; | ||
110 | uint8_t bDeviceSubClass; | ||
111 | uint8_t bDeviceProtocol; | ||
112 | uint8_t bConfigurationValue; | ||
113 | uint8_t bNumConfigurations; | ||
114 | uint8_t bNumInterfaces; | ||
115 | } __attribute__((packed)); | ||
116 | |||
117 | #define to_string(s) #s | ||
118 | |||
119 | void dump_usb_interface(struct usbip_usb_interface *); | ||
120 | void dump_usb_device(struct usbip_usb_device *); | ||
121 | int read_usb_device(struct udev_device *sdev, struct usbip_usb_device *udev); | ||
122 | int read_attr_value(struct udev_device *dev, const char *name, | ||
123 | const char *format); | ||
124 | int read_usb_interface(struct usbip_usb_device *udev, int i, | ||
125 | struct usbip_usb_interface *uinf); | ||
126 | |||
127 | const char *usbip_speed_string(int num); | ||
128 | const char *usbip_status_string(int32_t status); | ||
129 | |||
130 | int usbip_names_init(char *); | ||
131 | void usbip_names_free(void); | ||
132 | void usbip_names_get_product(char *buff, size_t size, uint16_t vendor, | ||
133 | uint16_t product); | ||
134 | void usbip_names_get_class(char *buff, size_t size, uint8_t class, | ||
135 | uint8_t subclass, uint8_t protocol); | ||
136 | |||
137 | #endif /* __USBIP_COMMON_H */ | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.c b/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.c deleted file mode 100644 index bef08d5c44e8..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.c +++ /dev/null | |||
@@ -1,280 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <sys/types.h> | ||
20 | #include <sys/stat.h> | ||
21 | #include <fcntl.h> | ||
22 | |||
23 | #include <errno.h> | ||
24 | #include <unistd.h> | ||
25 | |||
26 | #include <libudev.h> | ||
27 | |||
28 | #include "usbip_common.h" | ||
29 | #include "usbip_host_driver.h" | ||
30 | #include "list.h" | ||
31 | #include "sysfs_utils.h" | ||
32 | |||
33 | #undef PROGNAME | ||
34 | #define PROGNAME "libusbip" | ||
35 | |||
36 | struct usbip_host_driver *host_driver; | ||
37 | struct udev *udev_context; | ||
38 | |||
39 | static int32_t read_attr_usbip_status(struct usbip_usb_device *udev) | ||
40 | { | ||
41 | char status_attr_path[SYSFS_PATH_MAX]; | ||
42 | int fd; | ||
43 | int length; | ||
44 | char status; | ||
45 | int value = 0; | ||
46 | |||
47 | snprintf(status_attr_path, SYSFS_PATH_MAX, "%s/usbip_status", | ||
48 | udev->path); | ||
49 | |||
50 | fd = open(status_attr_path, O_RDONLY); | ||
51 | if (fd < 0) { | ||
52 | err("error opening attribute %s", status_attr_path); | ||
53 | return -1; | ||
54 | } | ||
55 | |||
56 | length = read(fd, &status, 1); | ||
57 | if (length < 0) { | ||
58 | err("error reading attribute %s", status_attr_path); | ||
59 | close(fd); | ||
60 | return -1; | ||
61 | } | ||
62 | |||
63 | value = atoi(&status); | ||
64 | |||
65 | return value; | ||
66 | } | ||
67 | |||
68 | static | ||
69 | struct usbip_exported_device *usbip_exported_device_new(const char *sdevpath) | ||
70 | { | ||
71 | struct usbip_exported_device *edev = NULL; | ||
72 | struct usbip_exported_device *edev_old; | ||
73 | size_t size; | ||
74 | int i; | ||
75 | |||
76 | edev = calloc(1, sizeof(struct usbip_exported_device)); | ||
77 | |||
78 | edev->sudev = udev_device_new_from_syspath(udev_context, sdevpath); | ||
79 | if (!edev->sudev) { | ||
80 | err("udev_device_new_from_syspath: %s", sdevpath); | ||
81 | goto err; | ||
82 | } | ||
83 | |||
84 | read_usb_device(edev->sudev, &edev->udev); | ||
85 | |||
86 | edev->status = read_attr_usbip_status(&edev->udev); | ||
87 | if (edev->status < 0) | ||
88 | goto err; | ||
89 | |||
90 | /* reallocate buffer to include usb interface data */ | ||
91 | size = sizeof(struct usbip_exported_device) + | ||
92 | edev->udev.bNumInterfaces * sizeof(struct usbip_usb_interface); | ||
93 | |||
94 | edev_old = edev; | ||
95 | edev = realloc(edev, size); | ||
96 | if (!edev) { | ||
97 | edev = edev_old; | ||
98 | dbg("realloc failed"); | ||
99 | goto err; | ||
100 | } | ||
101 | |||
102 | for (i = 0; i < edev->udev.bNumInterfaces; i++) | ||
103 | read_usb_interface(&edev->udev, i, &edev->uinf[i]); | ||
104 | |||
105 | return edev; | ||
106 | err: | ||
107 | if (edev->sudev) | ||
108 | udev_device_unref(edev->sudev); | ||
109 | if (edev) | ||
110 | free(edev); | ||
111 | |||
112 | return NULL; | ||
113 | } | ||
114 | |||
115 | static int refresh_exported_devices(void) | ||
116 | { | ||
117 | struct usbip_exported_device *edev; | ||
118 | struct udev_enumerate *enumerate; | ||
119 | struct udev_list_entry *devices, *dev_list_entry; | ||
120 | struct udev_device *dev; | ||
121 | const char *path; | ||
122 | const char *driver; | ||
123 | |||
124 | enumerate = udev_enumerate_new(udev_context); | ||
125 | udev_enumerate_add_match_subsystem(enumerate, "usb"); | ||
126 | udev_enumerate_scan_devices(enumerate); | ||
127 | |||
128 | devices = udev_enumerate_get_list_entry(enumerate); | ||
129 | |||
130 | udev_list_entry_foreach(dev_list_entry, devices) { | ||
131 | path = udev_list_entry_get_name(dev_list_entry); | ||
132 | dev = udev_device_new_from_syspath(udev_context, path); | ||
133 | if (dev == NULL) | ||
134 | continue; | ||
135 | |||
136 | /* Check whether device uses usbip-host driver. */ | ||
137 | driver = udev_device_get_driver(dev); | ||
138 | if (driver != NULL && !strcmp(driver, USBIP_HOST_DRV_NAME)) { | ||
139 | edev = usbip_exported_device_new(path); | ||
140 | if (!edev) { | ||
141 | dbg("usbip_exported_device_new failed"); | ||
142 | continue; | ||
143 | } | ||
144 | |||
145 | list_add(&edev->node, &host_driver->edev_list); | ||
146 | host_driver->ndevs++; | ||
147 | } | ||
148 | } | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | static void usbip_exported_device_destroy(void) | ||
154 | { | ||
155 | struct list_head *i, *tmp; | ||
156 | struct usbip_exported_device *edev; | ||
157 | |||
158 | list_for_each_safe(i, tmp, &host_driver->edev_list) { | ||
159 | edev = list_entry(i, struct usbip_exported_device, node); | ||
160 | list_del(i); | ||
161 | free(edev); | ||
162 | } | ||
163 | } | ||
164 | |||
165 | int usbip_host_driver_open(void) | ||
166 | { | ||
167 | int rc; | ||
168 | |||
169 | udev_context = udev_new(); | ||
170 | if (!udev_context) { | ||
171 | err("udev_new failed"); | ||
172 | return -1; | ||
173 | } | ||
174 | |||
175 | host_driver = calloc(1, sizeof(*host_driver)); | ||
176 | |||
177 | host_driver->ndevs = 0; | ||
178 | INIT_LIST_HEAD(&host_driver->edev_list); | ||
179 | |||
180 | rc = refresh_exported_devices(); | ||
181 | if (rc < 0) | ||
182 | goto err_free_host_driver; | ||
183 | |||
184 | return 0; | ||
185 | |||
186 | err_free_host_driver: | ||
187 | free(host_driver); | ||
188 | host_driver = NULL; | ||
189 | |||
190 | udev_unref(udev_context); | ||
191 | |||
192 | return -1; | ||
193 | } | ||
194 | |||
195 | void usbip_host_driver_close(void) | ||
196 | { | ||
197 | if (!host_driver) | ||
198 | return; | ||
199 | |||
200 | usbip_exported_device_destroy(); | ||
201 | |||
202 | free(host_driver); | ||
203 | host_driver = NULL; | ||
204 | |||
205 | udev_unref(udev_context); | ||
206 | } | ||
207 | |||
208 | int usbip_host_refresh_device_list(void) | ||
209 | { | ||
210 | int rc; | ||
211 | |||
212 | usbip_exported_device_destroy(); | ||
213 | |||
214 | host_driver->ndevs = 0; | ||
215 | INIT_LIST_HEAD(&host_driver->edev_list); | ||
216 | |||
217 | rc = refresh_exported_devices(); | ||
218 | if (rc < 0) | ||
219 | return -1; | ||
220 | |||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | int usbip_host_export_device(struct usbip_exported_device *edev, int sockfd) | ||
225 | { | ||
226 | char attr_name[] = "usbip_sockfd"; | ||
227 | char sockfd_attr_path[SYSFS_PATH_MAX]; | ||
228 | char sockfd_buff[30]; | ||
229 | int ret; | ||
230 | |||
231 | if (edev->status != SDEV_ST_AVAILABLE) { | ||
232 | dbg("device not available: %s", edev->udev.busid); | ||
233 | switch (edev->status) { | ||
234 | case SDEV_ST_ERROR: | ||
235 | dbg("status SDEV_ST_ERROR"); | ||
236 | break; | ||
237 | case SDEV_ST_USED: | ||
238 | dbg("status SDEV_ST_USED"); | ||
239 | break; | ||
240 | default: | ||
241 | dbg("status unknown: 0x%x", edev->status); | ||
242 | } | ||
243 | return -1; | ||
244 | } | ||
245 | |||
246 | /* only the first interface is true */ | ||
247 | snprintf(sockfd_attr_path, sizeof(sockfd_attr_path), "%s/%s", | ||
248 | edev->udev.path, attr_name); | ||
249 | |||
250 | snprintf(sockfd_buff, sizeof(sockfd_buff), "%d\n", sockfd); | ||
251 | |||
252 | ret = write_sysfs_attribute(sockfd_attr_path, sockfd_buff, | ||
253 | strlen(sockfd_buff)); | ||
254 | if (ret < 0) { | ||
255 | err("write_sysfs_attribute failed: sockfd %s to %s", | ||
256 | sockfd_buff, sockfd_attr_path); | ||
257 | return ret; | ||
258 | } | ||
259 | |||
260 | info("connect: %s", edev->udev.busid); | ||
261 | |||
262 | return ret; | ||
263 | } | ||
264 | |||
265 | struct usbip_exported_device *usbip_host_get_device(int num) | ||
266 | { | ||
267 | struct list_head *i; | ||
268 | struct usbip_exported_device *edev; | ||
269 | int cnt = 0; | ||
270 | |||
271 | list_for_each(i, &host_driver->edev_list) { | ||
272 | edev = list_entry(i, struct usbip_exported_device, node); | ||
273 | if (num == cnt) | ||
274 | return edev; | ||
275 | else | ||
276 | cnt++; | ||
277 | } | ||
278 | |||
279 | return NULL; | ||
280 | } | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.h b/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.h deleted file mode 100644 index 2a31f855c616..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/usbip_host_driver.h +++ /dev/null | |||
@@ -1,49 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #ifndef __USBIP_HOST_DRIVER_H | ||
20 | #define __USBIP_HOST_DRIVER_H | ||
21 | |||
22 | #include <stdint.h> | ||
23 | #include "usbip_common.h" | ||
24 | #include "list.h" | ||
25 | |||
26 | struct usbip_host_driver { | ||
27 | int ndevs; | ||
28 | /* list of exported device */ | ||
29 | struct list_head edev_list; | ||
30 | }; | ||
31 | |||
32 | struct usbip_exported_device { | ||
33 | struct udev_device *sudev; | ||
34 | int32_t status; | ||
35 | struct usbip_usb_device udev; | ||
36 | struct list_head node; | ||
37 | struct usbip_usb_interface uinf[]; | ||
38 | }; | ||
39 | |||
40 | extern struct usbip_host_driver *host_driver; | ||
41 | |||
42 | int usbip_host_driver_open(void); | ||
43 | void usbip_host_driver_close(void); | ||
44 | |||
45 | int usbip_host_refresh_device_list(void); | ||
46 | int usbip_host_export_device(struct usbip_exported_device *edev, int sockfd); | ||
47 | struct usbip_exported_device *usbip_host_get_device(int num); | ||
48 | |||
49 | #endif /* __USBIP_HOST_DRIVER_H */ | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/vhci_driver.c b/drivers/staging/usbip/userspace/libsrc/vhci_driver.c deleted file mode 100644 index ad9204773533..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/vhci_driver.c +++ /dev/null | |||
@@ -1,411 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2007 Takahiro Hirofuchi | ||
3 | */ | ||
4 | |||
5 | #include "usbip_common.h" | ||
6 | #include "vhci_driver.h" | ||
7 | #include <limits.h> | ||
8 | #include <netdb.h> | ||
9 | #include <libudev.h> | ||
10 | #include "sysfs_utils.h" | ||
11 | |||
12 | #undef PROGNAME | ||
13 | #define PROGNAME "libusbip" | ||
14 | |||
15 | struct usbip_vhci_driver *vhci_driver; | ||
16 | struct udev *udev_context; | ||
17 | |||
18 | static struct usbip_imported_device * | ||
19 | imported_device_init(struct usbip_imported_device *idev, char *busid) | ||
20 | { | ||
21 | struct udev_device *sudev; | ||
22 | |||
23 | sudev = udev_device_new_from_subsystem_sysname(udev_context, | ||
24 | "usb", busid); | ||
25 | if (!sudev) { | ||
26 | dbg("udev_device_new_from_subsystem_sysname failed: %s", busid); | ||
27 | goto err; | ||
28 | } | ||
29 | read_usb_device(sudev, &idev->udev); | ||
30 | udev_device_unref(sudev); | ||
31 | |||
32 | return idev; | ||
33 | |||
34 | err: | ||
35 | return NULL; | ||
36 | } | ||
37 | |||
38 | |||
39 | |||
40 | static int parse_status(const char *value) | ||
41 | { | ||
42 | int ret = 0; | ||
43 | char *c; | ||
44 | |||
45 | |||
46 | for (int i = 0; i < vhci_driver->nports; i++) | ||
47 | memset(&vhci_driver->idev[i], 0, sizeof(vhci_driver->idev[i])); | ||
48 | |||
49 | |||
50 | /* skip a header line */ | ||
51 | c = strchr(value, '\n'); | ||
52 | if (!c) | ||
53 | return -1; | ||
54 | c++; | ||
55 | |||
56 | while (*c != '\0') { | ||
57 | int port, status, speed, devid; | ||
58 | unsigned long socket; | ||
59 | char lbusid[SYSFS_BUS_ID_SIZE]; | ||
60 | |||
61 | ret = sscanf(c, "%d %d %d %x %lx %31s\n", | ||
62 | &port, &status, &speed, | ||
63 | &devid, &socket, lbusid); | ||
64 | |||
65 | if (ret < 5) { | ||
66 | dbg("sscanf failed: %d", ret); | ||
67 | BUG(); | ||
68 | } | ||
69 | |||
70 | dbg("port %d status %d speed %d devid %x", | ||
71 | port, status, speed, devid); | ||
72 | dbg("socket %lx lbusid %s", socket, lbusid); | ||
73 | |||
74 | |||
75 | /* if a device is connected, look at it */ | ||
76 | { | ||
77 | struct usbip_imported_device *idev = &vhci_driver->idev[port]; | ||
78 | |||
79 | idev->port = port; | ||
80 | idev->status = status; | ||
81 | |||
82 | idev->devid = devid; | ||
83 | |||
84 | idev->busnum = (devid >> 16); | ||
85 | idev->devnum = (devid & 0x0000ffff); | ||
86 | |||
87 | if (idev->status != VDEV_ST_NULL | ||
88 | && idev->status != VDEV_ST_NOTASSIGNED) { | ||
89 | idev = imported_device_init(idev, lbusid); | ||
90 | if (!idev) { | ||
91 | dbg("imported_device_init failed"); | ||
92 | return -1; | ||
93 | } | ||
94 | } | ||
95 | } | ||
96 | |||
97 | |||
98 | /* go to the next line */ | ||
99 | c = strchr(c, '\n'); | ||
100 | if (!c) | ||
101 | break; | ||
102 | c++; | ||
103 | } | ||
104 | |||
105 | dbg("exit"); | ||
106 | |||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | static int refresh_imported_device_list(void) | ||
111 | { | ||
112 | const char *attr_status; | ||
113 | |||
114 | attr_status = udev_device_get_sysattr_value(vhci_driver->hc_device, | ||
115 | "status"); | ||
116 | if (!attr_status) { | ||
117 | err("udev_device_get_sysattr_value failed"); | ||
118 | return -1; | ||
119 | } | ||
120 | |||
121 | return parse_status(attr_status); | ||
122 | } | ||
123 | |||
124 | static int get_nports(void) | ||
125 | { | ||
126 | char *c; | ||
127 | int nports = 0; | ||
128 | const char *attr_status; | ||
129 | |||
130 | attr_status = udev_device_get_sysattr_value(vhci_driver->hc_device, | ||
131 | "status"); | ||
132 | if (!attr_status) { | ||
133 | err("udev_device_get_sysattr_value failed"); | ||
134 | return -1; | ||
135 | } | ||
136 | |||
137 | /* skip a header line */ | ||
138 | c = strchr(attr_status, '\n'); | ||
139 | if (!c) | ||
140 | return 0; | ||
141 | c++; | ||
142 | |||
143 | while (*c != '\0') { | ||
144 | /* go to the next line */ | ||
145 | c = strchr(c, '\n'); | ||
146 | if (!c) | ||
147 | return nports; | ||
148 | c++; | ||
149 | nports += 1; | ||
150 | } | ||
151 | |||
152 | return nports; | ||
153 | } | ||
154 | |||
155 | /* | ||
156 | * Read the given port's record. | ||
157 | * | ||
158 | * To avoid buffer overflow we will read the entire line and | ||
159 | * validate each part's size. The initial buffer is padded by 4 to | ||
160 | * accommodate the 2 spaces, 1 newline and an additional character | ||
161 | * which is needed to properly validate the 3rd part without it being | ||
162 | * truncated to an acceptable length. | ||
163 | */ | ||
164 | static int read_record(int rhport, char *host, unsigned long host_len, | ||
165 | char *port, unsigned long port_len, char *busid) | ||
166 | { | ||
167 | int part; | ||
168 | FILE *file; | ||
169 | char path[PATH_MAX+1]; | ||
170 | char *buffer, *start, *end; | ||
171 | char delim[] = {' ', ' ', '\n'}; | ||
172 | int max_len[] = {(int)host_len, (int)port_len, SYSFS_BUS_ID_SIZE}; | ||
173 | size_t buffer_len = host_len + port_len + SYSFS_BUS_ID_SIZE + 4; | ||
174 | |||
175 | buffer = malloc(buffer_len); | ||
176 | if (!buffer) | ||
177 | return -1; | ||
178 | |||
179 | snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", rhport); | ||
180 | |||
181 | file = fopen(path, "r"); | ||
182 | if (!file) { | ||
183 | err("fopen"); | ||
184 | free(buffer); | ||
185 | return -1; | ||
186 | } | ||
187 | |||
188 | if (fgets(buffer, buffer_len, file) == NULL) { | ||
189 | err("fgets"); | ||
190 | free(buffer); | ||
191 | fclose(file); | ||
192 | return -1; | ||
193 | } | ||
194 | fclose(file); | ||
195 | |||
196 | /* validate the length of each of the 3 parts */ | ||
197 | start = buffer; | ||
198 | for (part = 0; part < 3; part++) { | ||
199 | end = strchr(start, delim[part]); | ||
200 | if (end == NULL || (end - start) > max_len[part]) { | ||
201 | free(buffer); | ||
202 | return -1; | ||
203 | } | ||
204 | start = end + 1; | ||
205 | } | ||
206 | |||
207 | if (sscanf(buffer, "%s %s %s\n", host, port, busid) != 3) { | ||
208 | err("sscanf"); | ||
209 | free(buffer); | ||
210 | return -1; | ||
211 | } | ||
212 | |||
213 | free(buffer); | ||
214 | |||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | /* ---------------------------------------------------------------------- */ | ||
219 | |||
220 | int usbip_vhci_driver_open(void) | ||
221 | { | ||
222 | udev_context = udev_new(); | ||
223 | if (!udev_context) { | ||
224 | err("udev_new failed"); | ||
225 | return -1; | ||
226 | } | ||
227 | |||
228 | vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver)); | ||
229 | |||
230 | /* will be freed in usbip_driver_close() */ | ||
231 | vhci_driver->hc_device = | ||
232 | udev_device_new_from_subsystem_sysname(udev_context, | ||
233 | USBIP_VHCI_BUS_TYPE, | ||
234 | USBIP_VHCI_DRV_NAME); | ||
235 | if (!vhci_driver->hc_device) { | ||
236 | err("udev_device_new_from_subsystem_sysname failed"); | ||
237 | goto err; | ||
238 | } | ||
239 | |||
240 | vhci_driver->nports = get_nports(); | ||
241 | |||
242 | dbg("available ports: %d", vhci_driver->nports); | ||
243 | |||
244 | if (refresh_imported_device_list()) | ||
245 | goto err; | ||
246 | |||
247 | return 0; | ||
248 | |||
249 | err: | ||
250 | udev_device_unref(vhci_driver->hc_device); | ||
251 | |||
252 | if (vhci_driver) | ||
253 | free(vhci_driver); | ||
254 | |||
255 | vhci_driver = NULL; | ||
256 | |||
257 | udev_unref(udev_context); | ||
258 | |||
259 | return -1; | ||
260 | } | ||
261 | |||
262 | |||
263 | void usbip_vhci_driver_close(void) | ||
264 | { | ||
265 | if (!vhci_driver) | ||
266 | return; | ||
267 | |||
268 | udev_device_unref(vhci_driver->hc_device); | ||
269 | |||
270 | free(vhci_driver); | ||
271 | |||
272 | vhci_driver = NULL; | ||
273 | |||
274 | udev_unref(udev_context); | ||
275 | } | ||
276 | |||
277 | |||
278 | int usbip_vhci_refresh_device_list(void) | ||
279 | { | ||
280 | |||
281 | if (refresh_imported_device_list()) | ||
282 | goto err; | ||
283 | |||
284 | return 0; | ||
285 | err: | ||
286 | dbg("failed to refresh device list"); | ||
287 | return -1; | ||
288 | } | ||
289 | |||
290 | |||
291 | int usbip_vhci_get_free_port(void) | ||
292 | { | ||
293 | for (int i = 0; i < vhci_driver->nports; i++) { | ||
294 | if (vhci_driver->idev[i].status == VDEV_ST_NULL) | ||
295 | return i; | ||
296 | } | ||
297 | |||
298 | return -1; | ||
299 | } | ||
300 | |||
301 | int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid, | ||
302 | uint32_t speed) { | ||
303 | char buff[200]; /* what size should be ? */ | ||
304 | char attach_attr_path[SYSFS_PATH_MAX]; | ||
305 | char attr_attach[] = "attach"; | ||
306 | const char *path; | ||
307 | int ret; | ||
308 | |||
309 | snprintf(buff, sizeof(buff), "%u %d %u %u", | ||
310 | port, sockfd, devid, speed); | ||
311 | dbg("writing: %s", buff); | ||
312 | |||
313 | path = udev_device_get_syspath(vhci_driver->hc_device); | ||
314 | snprintf(attach_attr_path, sizeof(attach_attr_path), "%s/%s", | ||
315 | path, attr_attach); | ||
316 | dbg("attach attribute path: %s", attach_attr_path); | ||
317 | |||
318 | ret = write_sysfs_attribute(attach_attr_path, buff, strlen(buff)); | ||
319 | if (ret < 0) { | ||
320 | dbg("write_sysfs_attribute failed"); | ||
321 | return -1; | ||
322 | } | ||
323 | |||
324 | dbg("attached port: %d", port); | ||
325 | |||
326 | return 0; | ||
327 | } | ||
328 | |||
329 | static unsigned long get_devid(uint8_t busnum, uint8_t devnum) | ||
330 | { | ||
331 | return (busnum << 16) | devnum; | ||
332 | } | ||
333 | |||
334 | /* will be removed */ | ||
335 | int usbip_vhci_attach_device(uint8_t port, int sockfd, uint8_t busnum, | ||
336 | uint8_t devnum, uint32_t speed) | ||
337 | { | ||
338 | int devid = get_devid(busnum, devnum); | ||
339 | |||
340 | return usbip_vhci_attach_device2(port, sockfd, devid, speed); | ||
341 | } | ||
342 | |||
343 | int usbip_vhci_detach_device(uint8_t port) | ||
344 | { | ||
345 | char detach_attr_path[SYSFS_PATH_MAX]; | ||
346 | char attr_detach[] = "detach"; | ||
347 | char buff[200]; /* what size should be ? */ | ||
348 | const char *path; | ||
349 | int ret; | ||
350 | |||
351 | snprintf(buff, sizeof(buff), "%u", port); | ||
352 | dbg("writing: %s", buff); | ||
353 | |||
354 | path = udev_device_get_syspath(vhci_driver->hc_device); | ||
355 | snprintf(detach_attr_path, sizeof(detach_attr_path), "%s/%s", | ||
356 | path, attr_detach); | ||
357 | dbg("detach attribute path: %s", detach_attr_path); | ||
358 | |||
359 | ret = write_sysfs_attribute(detach_attr_path, buff, strlen(buff)); | ||
360 | if (ret < 0) { | ||
361 | dbg("write_sysfs_attribute failed"); | ||
362 | return -1; | ||
363 | } | ||
364 | |||
365 | dbg("detached port: %d", port); | ||
366 | |||
367 | return 0; | ||
368 | } | ||
369 | |||
370 | int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev) | ||
371 | { | ||
372 | char product_name[100]; | ||
373 | char host[NI_MAXHOST] = "unknown host"; | ||
374 | char serv[NI_MAXSERV] = "unknown port"; | ||
375 | char remote_busid[SYSFS_BUS_ID_SIZE]; | ||
376 | int ret; | ||
377 | int read_record_error = 0; | ||
378 | |||
379 | if (idev->status == VDEV_ST_NULL || idev->status == VDEV_ST_NOTASSIGNED) | ||
380 | return 0; | ||
381 | |||
382 | ret = read_record(idev->port, host, sizeof(host), serv, sizeof(serv), | ||
383 | remote_busid); | ||
384 | if (ret) { | ||
385 | err("read_record"); | ||
386 | read_record_error = 1; | ||
387 | } | ||
388 | |||
389 | printf("Port %02d: <%s> at %s\n", idev->port, | ||
390 | usbip_status_string(idev->status), | ||
391 | usbip_speed_string(idev->udev.speed)); | ||
392 | |||
393 | usbip_names_get_product(product_name, sizeof(product_name), | ||
394 | idev->udev.idVendor, idev->udev.idProduct); | ||
395 | |||
396 | printf(" %s\n", product_name); | ||
397 | |||
398 | if (!read_record_error) { | ||
399 | printf("%10s -> usbip://%s:%s/%s\n", idev->udev.busid, | ||
400 | host, serv, remote_busid); | ||
401 | printf("%10s -> remote bus/dev %03d/%03d\n", " ", | ||
402 | idev->busnum, idev->devnum); | ||
403 | } else { | ||
404 | printf("%10s -> unknown host, remote port and remote busid\n", | ||
405 | idev->udev.busid); | ||
406 | printf("%10s -> remote bus/dev %03d/%03d\n", " ", | ||
407 | idev->busnum, idev->devnum); | ||
408 | } | ||
409 | |||
410 | return 0; | ||
411 | } | ||
diff --git a/drivers/staging/usbip/userspace/libsrc/vhci_driver.h b/drivers/staging/usbip/userspace/libsrc/vhci_driver.h deleted file mode 100644 index fa2316cf2cac..000000000000 --- a/drivers/staging/usbip/userspace/libsrc/vhci_driver.h +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2007 Takahiro Hirofuchi | ||
3 | */ | ||
4 | |||
5 | #ifndef __VHCI_DRIVER_H | ||
6 | #define __VHCI_DRIVER_H | ||
7 | |||
8 | #include <libudev.h> | ||
9 | #include <stdint.h> | ||
10 | |||
11 | #include "usbip_common.h" | ||
12 | |||
13 | #define USBIP_VHCI_BUS_TYPE "platform" | ||
14 | #define MAXNPORT 128 | ||
15 | |||
16 | struct usbip_imported_device { | ||
17 | uint8_t port; | ||
18 | uint32_t status; | ||
19 | |||
20 | uint32_t devid; | ||
21 | |||
22 | uint8_t busnum; | ||
23 | uint8_t devnum; | ||
24 | |||
25 | /* usbip_class_device list */ | ||
26 | struct usbip_usb_device udev; | ||
27 | }; | ||
28 | |||
29 | struct usbip_vhci_driver { | ||
30 | |||
31 | /* /sys/devices/platform/vhci_hcd */ | ||
32 | struct udev_device *hc_device; | ||
33 | |||
34 | int nports; | ||
35 | struct usbip_imported_device idev[MAXNPORT]; | ||
36 | }; | ||
37 | |||
38 | |||
39 | extern struct usbip_vhci_driver *vhci_driver; | ||
40 | |||
41 | int usbip_vhci_driver_open(void); | ||
42 | void usbip_vhci_driver_close(void); | ||
43 | |||
44 | int usbip_vhci_refresh_device_list(void); | ||
45 | |||
46 | |||
47 | int usbip_vhci_get_free_port(void); | ||
48 | int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid, | ||
49 | uint32_t speed); | ||
50 | |||
51 | /* will be removed */ | ||
52 | int usbip_vhci_attach_device(uint8_t port, int sockfd, uint8_t busnum, | ||
53 | uint8_t devnum, uint32_t speed); | ||
54 | |||
55 | int usbip_vhci_detach_device(uint8_t port); | ||
56 | |||
57 | int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev); | ||
58 | |||
59 | #endif /* __VHCI_DRIVER_H */ | ||
diff --git a/drivers/staging/usbip/userspace/src/Makefile.am b/drivers/staging/usbip/userspace/src/Makefile.am deleted file mode 100644 index e81a4ebadeff..000000000000 --- a/drivers/staging/usbip/userspace/src/Makefile.am +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | AM_CPPFLAGS = -I$(top_srcdir)/libsrc -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"' | ||
2 | AM_CFLAGS = @EXTRA_CFLAGS@ | ||
3 | LDADD = $(top_builddir)/libsrc/libusbip.la | ||
4 | |||
5 | sbin_PROGRAMS := usbip usbipd | ||
6 | |||
7 | usbip_SOURCES := usbip.h utils.h usbip.c utils.c usbip_network.c \ | ||
8 | usbip_attach.c usbip_detach.c usbip_list.c \ | ||
9 | usbip_bind.c usbip_unbind.c usbip_port.c | ||
10 | |||
11 | usbipd_SOURCES := usbip_network.h usbipd.c usbip_network.c | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip.c b/drivers/staging/usbip/userspace/src/usbip.c deleted file mode 100644 index d7599d943529..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip.c +++ /dev/null | |||
@@ -1,201 +0,0 @@ | |||
1 | /* | ||
2 | * command structure borrowed from udev | ||
3 | * (git://git.kernel.org/pub/scm/linux/hotplug/udev.git) | ||
4 | * | ||
5 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
6 | * 2005-2007 Takahiro Hirofuchi | ||
7 | * | ||
8 | * This program is free software: you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation, either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
20 | */ | ||
21 | |||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | |||
25 | #include <getopt.h> | ||
26 | #include <syslog.h> | ||
27 | |||
28 | #include "usbip_common.h" | ||
29 | #include "usbip_network.h" | ||
30 | #include "usbip.h" | ||
31 | |||
32 | static int usbip_help(int argc, char *argv[]); | ||
33 | static int usbip_version(int argc, char *argv[]); | ||
34 | |||
35 | static const char usbip_version_string[] = PACKAGE_STRING; | ||
36 | |||
37 | static const char usbip_usage_string[] = | ||
38 | "usbip [--debug] [--log] [--tcp-port PORT] [version]\n" | ||
39 | " [help] <command> <args>\n"; | ||
40 | |||
41 | static void usbip_usage(void) | ||
42 | { | ||
43 | printf("usage: %s", usbip_usage_string); | ||
44 | } | ||
45 | |||
46 | struct command { | ||
47 | const char *name; | ||
48 | int (*fn)(int argc, char *argv[]); | ||
49 | const char *help; | ||
50 | void (*usage)(void); | ||
51 | }; | ||
52 | |||
53 | static const struct command cmds[] = { | ||
54 | { | ||
55 | .name = "help", | ||
56 | .fn = usbip_help, | ||
57 | .help = NULL, | ||
58 | .usage = NULL | ||
59 | }, | ||
60 | { | ||
61 | .name = "version", | ||
62 | .fn = usbip_version, | ||
63 | .help = NULL, | ||
64 | .usage = NULL | ||
65 | }, | ||
66 | { | ||
67 | .name = "attach", | ||
68 | .fn = usbip_attach, | ||
69 | .help = "Attach a remote USB device", | ||
70 | .usage = usbip_attach_usage | ||
71 | }, | ||
72 | { | ||
73 | .name = "detach", | ||
74 | .fn = usbip_detach, | ||
75 | .help = "Detach a remote USB device", | ||
76 | .usage = usbip_detach_usage | ||
77 | }, | ||
78 | { | ||
79 | .name = "list", | ||
80 | .fn = usbip_list, | ||
81 | .help = "List exportable or local USB devices", | ||
82 | .usage = usbip_list_usage | ||
83 | }, | ||
84 | { | ||
85 | .name = "bind", | ||
86 | .fn = usbip_bind, | ||
87 | .help = "Bind device to " USBIP_HOST_DRV_NAME ".ko", | ||
88 | .usage = usbip_bind_usage | ||
89 | }, | ||
90 | { | ||
91 | .name = "unbind", | ||
92 | .fn = usbip_unbind, | ||
93 | .help = "Unbind device from " USBIP_HOST_DRV_NAME ".ko", | ||
94 | .usage = usbip_unbind_usage | ||
95 | }, | ||
96 | { | ||
97 | .name = "port", | ||
98 | .fn = usbip_port_show, | ||
99 | .help = "Show imported USB devices", | ||
100 | .usage = NULL | ||
101 | }, | ||
102 | { NULL, NULL, NULL, NULL } | ||
103 | }; | ||
104 | |||
105 | static int usbip_help(int argc, char *argv[]) | ||
106 | { | ||
107 | const struct command *cmd; | ||
108 | int i; | ||
109 | int ret = 0; | ||
110 | |||
111 | if (argc > 1 && argv++) { | ||
112 | for (i = 0; cmds[i].name != NULL; i++) | ||
113 | if (!strcmp(cmds[i].name, argv[0]) && cmds[i].usage) { | ||
114 | cmds[i].usage(); | ||
115 | goto done; | ||
116 | } | ||
117 | ret = -1; | ||
118 | } | ||
119 | |||
120 | usbip_usage(); | ||
121 | printf("\n"); | ||
122 | for (cmd = cmds; cmd->name != NULL; cmd++) | ||
123 | if (cmd->help != NULL) | ||
124 | printf(" %-10s %s\n", cmd->name, cmd->help); | ||
125 | printf("\n"); | ||
126 | done: | ||
127 | return ret; | ||
128 | } | ||
129 | |||
130 | static int usbip_version(int argc, char *argv[]) | ||
131 | { | ||
132 | (void) argc; | ||
133 | (void) argv; | ||
134 | |||
135 | printf(PROGNAME " (%s)\n", usbip_version_string); | ||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static int run_command(const struct command *cmd, int argc, char *argv[]) | ||
140 | { | ||
141 | dbg("running command: `%s'", cmd->name); | ||
142 | return cmd->fn(argc, argv); | ||
143 | } | ||
144 | |||
145 | int main(int argc, char *argv[]) | ||
146 | { | ||
147 | static const struct option opts[] = { | ||
148 | { "debug", no_argument, NULL, 'd' }, | ||
149 | { "log", no_argument, NULL, 'l' }, | ||
150 | { "tcp-port", required_argument, NULL, 't' }, | ||
151 | { NULL, 0, NULL, 0 } | ||
152 | }; | ||
153 | |||
154 | char *cmd; | ||
155 | int opt; | ||
156 | int i, rc = -1; | ||
157 | |||
158 | usbip_use_stderr = 1; | ||
159 | opterr = 0; | ||
160 | for (;;) { | ||
161 | opt = getopt_long(argc, argv, "+dlt:", opts, NULL); | ||
162 | |||
163 | if (opt == -1) | ||
164 | break; | ||
165 | |||
166 | switch (opt) { | ||
167 | case 'd': | ||
168 | usbip_use_debug = 1; | ||
169 | break; | ||
170 | case 'l': | ||
171 | usbip_use_syslog = 1; | ||
172 | openlog("", LOG_PID, LOG_USER); | ||
173 | break; | ||
174 | case 't': | ||
175 | usbip_setup_port_number(optarg); | ||
176 | break; | ||
177 | case '?': | ||
178 | printf("usbip: invalid option\n"); | ||
179 | default: | ||
180 | usbip_usage(); | ||
181 | goto out; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | cmd = argv[optind]; | ||
186 | if (cmd) { | ||
187 | for (i = 0; cmds[i].name != NULL; i++) | ||
188 | if (!strcmp(cmds[i].name, cmd)) { | ||
189 | argc -= optind; | ||
190 | argv += optind; | ||
191 | optind = 0; | ||
192 | rc = run_command(&cmds[i], argc, argv); | ||
193 | goto out; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | /* invalid command */ | ||
198 | usbip_help(0, NULL); | ||
199 | out: | ||
200 | return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE); | ||
201 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip.h b/drivers/staging/usbip/userspace/src/usbip.h deleted file mode 100644 index 84fe66a9d8ad..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip.h +++ /dev/null | |||
@@ -1,40 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #ifndef __USBIP_H | ||
20 | #define __USBIP_H | ||
21 | |||
22 | #ifdef HAVE_CONFIG_H | ||
23 | #include "../config.h" | ||
24 | #endif | ||
25 | |||
26 | /* usbip commands */ | ||
27 | int usbip_attach(int argc, char *argv[]); | ||
28 | int usbip_detach(int argc, char *argv[]); | ||
29 | int usbip_list(int argc, char *argv[]); | ||
30 | int usbip_bind(int argc, char *argv[]); | ||
31 | int usbip_unbind(int argc, char *argv[]); | ||
32 | int usbip_port_show(int argc, char *argv[]); | ||
33 | |||
34 | void usbip_attach_usage(void); | ||
35 | void usbip_detach_usage(void); | ||
36 | void usbip_list_usage(void); | ||
37 | void usbip_bind_usage(void); | ||
38 | void usbip_unbind_usage(void); | ||
39 | |||
40 | #endif /* __USBIP_H */ | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_attach.c b/drivers/staging/usbip/userspace/src/usbip_attach.c deleted file mode 100644 index d58a14dfc094..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_attach.c +++ /dev/null | |||
@@ -1,241 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <sys/stat.h> | ||
20 | |||
21 | #include <limits.h> | ||
22 | #include <stdint.h> | ||
23 | #include <stdio.h> | ||
24 | #include <string.h> | ||
25 | |||
26 | #include <fcntl.h> | ||
27 | #include <getopt.h> | ||
28 | #include <unistd.h> | ||
29 | #include <errno.h> | ||
30 | |||
31 | #include "vhci_driver.h" | ||
32 | #include "usbip_common.h" | ||
33 | #include "usbip_network.h" | ||
34 | #include "usbip.h" | ||
35 | |||
36 | static const char usbip_attach_usage_string[] = | ||
37 | "usbip attach <args>\n" | ||
38 | " -r, --remote=<host> The machine with exported USB devices\n" | ||
39 | " -b, --busid=<busid> Busid of the device on <host>\n"; | ||
40 | |||
41 | void usbip_attach_usage(void) | ||
42 | { | ||
43 | printf("usage: %s", usbip_attach_usage_string); | ||
44 | } | ||
45 | |||
46 | #define MAX_BUFF 100 | ||
47 | static int record_connection(char *host, char *port, char *busid, int rhport) | ||
48 | { | ||
49 | int fd; | ||
50 | char path[PATH_MAX+1]; | ||
51 | char buff[MAX_BUFF+1]; | ||
52 | int ret; | ||
53 | |||
54 | ret = mkdir(VHCI_STATE_PATH, 0700); | ||
55 | if (ret < 0) { | ||
56 | /* if VHCI_STATE_PATH exists, then it better be a directory */ | ||
57 | if (errno == EEXIST) { | ||
58 | struct stat s; | ||
59 | |||
60 | ret = stat(VHCI_STATE_PATH, &s); | ||
61 | if (ret < 0) | ||
62 | return -1; | ||
63 | if (!(s.st_mode & S_IFDIR)) | ||
64 | return -1; | ||
65 | } else | ||
66 | return -1; | ||
67 | } | ||
68 | |||
69 | snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", rhport); | ||
70 | |||
71 | fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU); | ||
72 | if (fd < 0) | ||
73 | return -1; | ||
74 | |||
75 | snprintf(buff, MAX_BUFF, "%s %s %s\n", | ||
76 | host, port, busid); | ||
77 | |||
78 | ret = write(fd, buff, strlen(buff)); | ||
79 | if (ret != (ssize_t) strlen(buff)) { | ||
80 | close(fd); | ||
81 | return -1; | ||
82 | } | ||
83 | |||
84 | close(fd); | ||
85 | |||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | static int import_device(int sockfd, struct usbip_usb_device *udev) | ||
90 | { | ||
91 | int rc; | ||
92 | int port; | ||
93 | |||
94 | rc = usbip_vhci_driver_open(); | ||
95 | if (rc < 0) { | ||
96 | err("open vhci_driver"); | ||
97 | return -1; | ||
98 | } | ||
99 | |||
100 | port = usbip_vhci_get_free_port(); | ||
101 | if (port < 0) { | ||
102 | err("no free port"); | ||
103 | usbip_vhci_driver_close(); | ||
104 | return -1; | ||
105 | } | ||
106 | |||
107 | rc = usbip_vhci_attach_device(port, sockfd, udev->busnum, | ||
108 | udev->devnum, udev->speed); | ||
109 | if (rc < 0) { | ||
110 | err("import device"); | ||
111 | usbip_vhci_driver_close(); | ||
112 | return -1; | ||
113 | } | ||
114 | |||
115 | usbip_vhci_driver_close(); | ||
116 | |||
117 | return port; | ||
118 | } | ||
119 | |||
120 | static int query_import_device(int sockfd, char *busid) | ||
121 | { | ||
122 | int rc; | ||
123 | struct op_import_request request; | ||
124 | struct op_import_reply reply; | ||
125 | uint16_t code = OP_REP_IMPORT; | ||
126 | |||
127 | memset(&request, 0, sizeof(request)); | ||
128 | memset(&reply, 0, sizeof(reply)); | ||
129 | |||
130 | /* send a request */ | ||
131 | rc = usbip_net_send_op_common(sockfd, OP_REQ_IMPORT, 0); | ||
132 | if (rc < 0) { | ||
133 | err("send op_common"); | ||
134 | return -1; | ||
135 | } | ||
136 | |||
137 | strncpy(request.busid, busid, SYSFS_BUS_ID_SIZE-1); | ||
138 | |||
139 | PACK_OP_IMPORT_REQUEST(0, &request); | ||
140 | |||
141 | rc = usbip_net_send(sockfd, (void *) &request, sizeof(request)); | ||
142 | if (rc < 0) { | ||
143 | err("send op_import_request"); | ||
144 | return -1; | ||
145 | } | ||
146 | |||
147 | /* receive a reply */ | ||
148 | rc = usbip_net_recv_op_common(sockfd, &code); | ||
149 | if (rc < 0) { | ||
150 | err("recv op_common"); | ||
151 | return -1; | ||
152 | } | ||
153 | |||
154 | rc = usbip_net_recv(sockfd, (void *) &reply, sizeof(reply)); | ||
155 | if (rc < 0) { | ||
156 | err("recv op_import_reply"); | ||
157 | return -1; | ||
158 | } | ||
159 | |||
160 | PACK_OP_IMPORT_REPLY(0, &reply); | ||
161 | |||
162 | /* check the reply */ | ||
163 | if (strncmp(reply.udev.busid, busid, SYSFS_BUS_ID_SIZE)) { | ||
164 | err("recv different busid %s", reply.udev.busid); | ||
165 | return -1; | ||
166 | } | ||
167 | |||
168 | /* import a device */ | ||
169 | return import_device(sockfd, &reply.udev); | ||
170 | } | ||
171 | |||
172 | static int attach_device(char *host, char *busid) | ||
173 | { | ||
174 | int sockfd; | ||
175 | int rc; | ||
176 | int rhport; | ||
177 | |||
178 | sockfd = usbip_net_tcp_connect(host, usbip_port_string); | ||
179 | if (sockfd < 0) { | ||
180 | err("tcp connect"); | ||
181 | return -1; | ||
182 | } | ||
183 | |||
184 | rhport = query_import_device(sockfd, busid); | ||
185 | if (rhport < 0) { | ||
186 | err("query"); | ||
187 | return -1; | ||
188 | } | ||
189 | |||
190 | close(sockfd); | ||
191 | |||
192 | rc = record_connection(host, usbip_port_string, busid, rhport); | ||
193 | if (rc < 0) { | ||
194 | err("record connection"); | ||
195 | return -1; | ||
196 | } | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | int usbip_attach(int argc, char *argv[]) | ||
202 | { | ||
203 | static const struct option opts[] = { | ||
204 | { "remote", required_argument, NULL, 'r' }, | ||
205 | { "busid", required_argument, NULL, 'b' }, | ||
206 | { NULL, 0, NULL, 0 } | ||
207 | }; | ||
208 | char *host = NULL; | ||
209 | char *busid = NULL; | ||
210 | int opt; | ||
211 | int ret = -1; | ||
212 | |||
213 | for (;;) { | ||
214 | opt = getopt_long(argc, argv, "r:b:", opts, NULL); | ||
215 | |||
216 | if (opt == -1) | ||
217 | break; | ||
218 | |||
219 | switch (opt) { | ||
220 | case 'r': | ||
221 | host = optarg; | ||
222 | break; | ||
223 | case 'b': | ||
224 | busid = optarg; | ||
225 | break; | ||
226 | default: | ||
227 | goto err_out; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | if (!host || !busid) | ||
232 | goto err_out; | ||
233 | |||
234 | ret = attach_device(host, busid); | ||
235 | goto out; | ||
236 | |||
237 | err_out: | ||
238 | usbip_attach_usage(); | ||
239 | out: | ||
240 | return ret; | ||
241 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_bind.c b/drivers/staging/usbip/userspace/src/usbip_bind.c deleted file mode 100644 index fa46141ae68b..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_bind.c +++ /dev/null | |||
@@ -1,214 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <libudev.h> | ||
20 | |||
21 | #include <errno.h> | ||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <string.h> | ||
25 | |||
26 | #include <getopt.h> | ||
27 | |||
28 | #include "usbip_common.h" | ||
29 | #include "utils.h" | ||
30 | #include "usbip.h" | ||
31 | #include "sysfs_utils.h" | ||
32 | |||
33 | enum unbind_status { | ||
34 | UNBIND_ST_OK, | ||
35 | UNBIND_ST_USBIP_HOST, | ||
36 | UNBIND_ST_FAILED | ||
37 | }; | ||
38 | |||
39 | static const char usbip_bind_usage_string[] = | ||
40 | "usbip bind <args>\n" | ||
41 | " -b, --busid=<busid> Bind " USBIP_HOST_DRV_NAME ".ko to device " | ||
42 | "on <busid>\n"; | ||
43 | |||
44 | void usbip_bind_usage(void) | ||
45 | { | ||
46 | printf("usage: %s", usbip_bind_usage_string); | ||
47 | } | ||
48 | |||
49 | /* call at unbound state */ | ||
50 | static int bind_usbip(char *busid) | ||
51 | { | ||
52 | char attr_name[] = "bind"; | ||
53 | char bind_attr_path[SYSFS_PATH_MAX]; | ||
54 | int rc = -1; | ||
55 | |||
56 | snprintf(bind_attr_path, sizeof(bind_attr_path), "%s/%s/%s/%s/%s/%s", | ||
57 | SYSFS_MNT_PATH, SYSFS_BUS_NAME, SYSFS_BUS_TYPE, | ||
58 | SYSFS_DRIVERS_NAME, USBIP_HOST_DRV_NAME, attr_name); | ||
59 | |||
60 | rc = write_sysfs_attribute(bind_attr_path, busid, strlen(busid)); | ||
61 | if (rc < 0) { | ||
62 | err("error binding device %s to driver: %s", busid, | ||
63 | strerror(errno)); | ||
64 | return -1; | ||
65 | } | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | /* buggy driver may cause dead lock */ | ||
71 | static int unbind_other(char *busid) | ||
72 | { | ||
73 | enum unbind_status status = UNBIND_ST_OK; | ||
74 | |||
75 | char attr_name[] = "unbind"; | ||
76 | char unbind_attr_path[SYSFS_PATH_MAX]; | ||
77 | int rc = -1; | ||
78 | |||
79 | struct udev *udev; | ||
80 | struct udev_device *dev; | ||
81 | const char *driver; | ||
82 | const char *bDevClass; | ||
83 | |||
84 | /* Create libudev context. */ | ||
85 | udev = udev_new(); | ||
86 | |||
87 | /* Get the device. */ | ||
88 | dev = udev_device_new_from_subsystem_sysname(udev, "usb", busid); | ||
89 | if (!dev) { | ||
90 | dbg("unable to find device with bus ID %s", busid); | ||
91 | goto err_close_busid_dev; | ||
92 | } | ||
93 | |||
94 | /* Check what kind of device it is. */ | ||
95 | bDevClass = udev_device_get_sysattr_value(dev, "bDeviceClass"); | ||
96 | if (!bDevClass) { | ||
97 | dbg("unable to get bDevClass device attribute"); | ||
98 | goto err_close_busid_dev; | ||
99 | } | ||
100 | |||
101 | if (!strncmp(bDevClass, "09", strlen(bDevClass))) { | ||
102 | dbg("skip unbinding of hub"); | ||
103 | goto err_close_busid_dev; | ||
104 | } | ||
105 | |||
106 | /* Get the device driver. */ | ||
107 | driver = udev_device_get_driver(dev); | ||
108 | if (!driver) { | ||
109 | /* No driver bound to this device. */ | ||
110 | goto out; | ||
111 | } | ||
112 | |||
113 | if (!strncmp(USBIP_HOST_DRV_NAME, driver, | ||
114 | strlen(USBIP_HOST_DRV_NAME))) { | ||
115 | /* Already bound to usbip-host. */ | ||
116 | status = UNBIND_ST_USBIP_HOST; | ||
117 | goto out; | ||
118 | } | ||
119 | |||
120 | /* Unbind device from driver. */ | ||
121 | snprintf(unbind_attr_path, sizeof(unbind_attr_path), "%s/%s/%s/%s/%s/%s", | ||
122 | SYSFS_MNT_PATH, SYSFS_BUS_NAME, SYSFS_BUS_TYPE, | ||
123 | SYSFS_DRIVERS_NAME, driver, attr_name); | ||
124 | |||
125 | rc = write_sysfs_attribute(unbind_attr_path, busid, strlen(busid)); | ||
126 | if (rc < 0) { | ||
127 | err("error unbinding device %s from driver", busid); | ||
128 | goto err_close_busid_dev; | ||
129 | } | ||
130 | |||
131 | goto out; | ||
132 | |||
133 | err_close_busid_dev: | ||
134 | status = UNBIND_ST_FAILED; | ||
135 | out: | ||
136 | udev_device_unref(dev); | ||
137 | udev_unref(udev); | ||
138 | |||
139 | return status; | ||
140 | } | ||
141 | |||
142 | static int bind_device(char *busid) | ||
143 | { | ||
144 | int rc; | ||
145 | struct udev *udev; | ||
146 | struct udev_device *dev; | ||
147 | |||
148 | /* Check whether the device with this bus ID exists. */ | ||
149 | udev = udev_new(); | ||
150 | dev = udev_device_new_from_subsystem_sysname(udev, "usb", busid); | ||
151 | if (!dev) { | ||
152 | err("device with the specified bus ID does not exist"); | ||
153 | return -1; | ||
154 | } | ||
155 | udev_unref(udev); | ||
156 | |||
157 | rc = unbind_other(busid); | ||
158 | if (rc == UNBIND_ST_FAILED) { | ||
159 | err("could not unbind driver from device on busid %s", busid); | ||
160 | return -1; | ||
161 | } else if (rc == UNBIND_ST_USBIP_HOST) { | ||
162 | err("device on busid %s is already bound to %s", busid, | ||
163 | USBIP_HOST_DRV_NAME); | ||
164 | return -1; | ||
165 | } | ||
166 | |||
167 | rc = modify_match_busid(busid, 1); | ||
168 | if (rc < 0) { | ||
169 | err("unable to bind device on %s", busid); | ||
170 | return -1; | ||
171 | } | ||
172 | |||
173 | rc = bind_usbip(busid); | ||
174 | if (rc < 0) { | ||
175 | err("could not bind device to %s", USBIP_HOST_DRV_NAME); | ||
176 | modify_match_busid(busid, 0); | ||
177 | return -1; | ||
178 | } | ||
179 | |||
180 | info("bind device on busid %s: complete", busid); | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | int usbip_bind(int argc, char *argv[]) | ||
186 | { | ||
187 | static const struct option opts[] = { | ||
188 | { "busid", required_argument, NULL, 'b' }, | ||
189 | { NULL, 0, NULL, 0 } | ||
190 | }; | ||
191 | |||
192 | int opt; | ||
193 | int ret = -1; | ||
194 | |||
195 | for (;;) { | ||
196 | opt = getopt_long(argc, argv, "b:", opts, NULL); | ||
197 | |||
198 | if (opt == -1) | ||
199 | break; | ||
200 | |||
201 | switch (opt) { | ||
202 | case 'b': | ||
203 | ret = bind_device(optarg); | ||
204 | goto out; | ||
205 | default: | ||
206 | goto err_out; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | err_out: | ||
211 | usbip_bind_usage(); | ||
212 | out: | ||
213 | return ret; | ||
214 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_detach.c b/drivers/staging/usbip/userspace/src/usbip_detach.c deleted file mode 100644 index 05c6d15856eb..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_detach.c +++ /dev/null | |||
@@ -1,110 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <ctype.h> | ||
20 | #include <limits.h> | ||
21 | #include <stdint.h> | ||
22 | #include <stdio.h> | ||
23 | #include <stdlib.h> | ||
24 | #include <string.h> | ||
25 | |||
26 | #include <getopt.h> | ||
27 | #include <unistd.h> | ||
28 | |||
29 | #include "vhci_driver.h" | ||
30 | #include "usbip_common.h" | ||
31 | #include "usbip_network.h" | ||
32 | #include "usbip.h" | ||
33 | |||
34 | static const char usbip_detach_usage_string[] = | ||
35 | "usbip detach <args>\n" | ||
36 | " -p, --port=<port> " USBIP_VHCI_DRV_NAME | ||
37 | " port the device is on\n"; | ||
38 | |||
39 | void usbip_detach_usage(void) | ||
40 | { | ||
41 | printf("usage: %s", usbip_detach_usage_string); | ||
42 | } | ||
43 | |||
44 | static int detach_port(char *port) | ||
45 | { | ||
46 | int ret; | ||
47 | uint8_t portnum; | ||
48 | char path[PATH_MAX+1]; | ||
49 | |||
50 | for (unsigned int i = 0; i < strlen(port); i++) | ||
51 | if (!isdigit(port[i])) { | ||
52 | err("invalid port %s", port); | ||
53 | return -1; | ||
54 | } | ||
55 | |||
56 | /* check max port */ | ||
57 | |||
58 | portnum = atoi(port); | ||
59 | |||
60 | /* remove the port state file */ | ||
61 | |||
62 | snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", portnum); | ||
63 | |||
64 | remove(path); | ||
65 | rmdir(VHCI_STATE_PATH); | ||
66 | |||
67 | ret = usbip_vhci_driver_open(); | ||
68 | if (ret < 0) { | ||
69 | err("open vhci_driver"); | ||
70 | return -1; | ||
71 | } | ||
72 | |||
73 | ret = usbip_vhci_detach_device(portnum); | ||
74 | if (ret < 0) | ||
75 | return -1; | ||
76 | |||
77 | usbip_vhci_driver_close(); | ||
78 | |||
79 | return ret; | ||
80 | } | ||
81 | |||
82 | int usbip_detach(int argc, char *argv[]) | ||
83 | { | ||
84 | static const struct option opts[] = { | ||
85 | { "port", required_argument, NULL, 'p' }, | ||
86 | { NULL, 0, NULL, 0 } | ||
87 | }; | ||
88 | int opt; | ||
89 | int ret = -1; | ||
90 | |||
91 | for (;;) { | ||
92 | opt = getopt_long(argc, argv, "p:", opts, NULL); | ||
93 | |||
94 | if (opt == -1) | ||
95 | break; | ||
96 | |||
97 | switch (opt) { | ||
98 | case 'p': | ||
99 | ret = detach_port(optarg); | ||
100 | goto out; | ||
101 | default: | ||
102 | goto err_out; | ||
103 | } | ||
104 | } | ||
105 | |||
106 | err_out: | ||
107 | usbip_detach_usage(); | ||
108 | out: | ||
109 | return ret; | ||
110 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_list.c b/drivers/staging/usbip/userspace/src/usbip_list.c deleted file mode 100644 index d5ce34a410e7..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_list.c +++ /dev/null | |||
@@ -1,283 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <sys/types.h> | ||
20 | #include <libudev.h> | ||
21 | |||
22 | #include <errno.h> | ||
23 | #include <stdbool.h> | ||
24 | #include <stdint.h> | ||
25 | #include <stdio.h> | ||
26 | #include <stdlib.h> | ||
27 | #include <string.h> | ||
28 | |||
29 | #include <getopt.h> | ||
30 | #include <netdb.h> | ||
31 | #include <unistd.h> | ||
32 | |||
33 | #include "usbip_common.h" | ||
34 | #include "usbip_network.h" | ||
35 | #include "usbip.h" | ||
36 | |||
37 | static const char usbip_list_usage_string[] = | ||
38 | "usbip list [-p|--parsable] <args>\n" | ||
39 | " -p, --parsable Parsable list format\n" | ||
40 | " -r, --remote=<host> List the exportable USB devices on <host>\n" | ||
41 | " -l, --local List the local USB devices\n"; | ||
42 | |||
43 | void usbip_list_usage(void) | ||
44 | { | ||
45 | printf("usage: %s", usbip_list_usage_string); | ||
46 | } | ||
47 | |||
48 | static int get_exported_devices(char *host, int sockfd) | ||
49 | { | ||
50 | char product_name[100]; | ||
51 | char class_name[100]; | ||
52 | struct op_devlist_reply reply; | ||
53 | uint16_t code = OP_REP_DEVLIST; | ||
54 | struct usbip_usb_device udev; | ||
55 | struct usbip_usb_interface uintf; | ||
56 | unsigned int i; | ||
57 | int rc, j; | ||
58 | |||
59 | rc = usbip_net_send_op_common(sockfd, OP_REQ_DEVLIST, 0); | ||
60 | if (rc < 0) { | ||
61 | dbg("usbip_net_send_op_common failed"); | ||
62 | return -1; | ||
63 | } | ||
64 | |||
65 | rc = usbip_net_recv_op_common(sockfd, &code); | ||
66 | if (rc < 0) { | ||
67 | dbg("usbip_net_recv_op_common failed"); | ||
68 | return -1; | ||
69 | } | ||
70 | |||
71 | memset(&reply, 0, sizeof(reply)); | ||
72 | rc = usbip_net_recv(sockfd, &reply, sizeof(reply)); | ||
73 | if (rc < 0) { | ||
74 | dbg("usbip_net_recv_op_devlist failed"); | ||
75 | return -1; | ||
76 | } | ||
77 | PACK_OP_DEVLIST_REPLY(0, &reply); | ||
78 | dbg("exportable devices: %d\n", reply.ndev); | ||
79 | |||
80 | if (reply.ndev == 0) { | ||
81 | info("no exportable devices found on %s", host); | ||
82 | return 0; | ||
83 | } | ||
84 | |||
85 | printf("Exportable USB devices\n"); | ||
86 | printf("======================\n"); | ||
87 | printf(" - %s\n", host); | ||
88 | |||
89 | for (i = 0; i < reply.ndev; i++) { | ||
90 | memset(&udev, 0, sizeof(udev)); | ||
91 | rc = usbip_net_recv(sockfd, &udev, sizeof(udev)); | ||
92 | if (rc < 0) { | ||
93 | dbg("usbip_net_recv failed: usbip_usb_device[%d]", i); | ||
94 | return -1; | ||
95 | } | ||
96 | usbip_net_pack_usb_device(0, &udev); | ||
97 | |||
98 | usbip_names_get_product(product_name, sizeof(product_name), | ||
99 | udev.idVendor, udev.idProduct); | ||
100 | usbip_names_get_class(class_name, sizeof(class_name), | ||
101 | udev.bDeviceClass, udev.bDeviceSubClass, | ||
102 | udev.bDeviceProtocol); | ||
103 | printf("%11s: %s\n", udev.busid, product_name); | ||
104 | printf("%11s: %s\n", "", udev.path); | ||
105 | printf("%11s: %s\n", "", class_name); | ||
106 | |||
107 | for (j = 0; j < udev.bNumInterfaces; j++) { | ||
108 | rc = usbip_net_recv(sockfd, &uintf, sizeof(uintf)); | ||
109 | if (rc < 0) { | ||
110 | err("usbip_net_recv failed: usbip_usb_intf[%d]", | ||
111 | j); | ||
112 | |||
113 | return -1; | ||
114 | } | ||
115 | usbip_net_pack_usb_interface(0, &uintf); | ||
116 | |||
117 | usbip_names_get_class(class_name, sizeof(class_name), | ||
118 | uintf.bInterfaceClass, | ||
119 | uintf.bInterfaceSubClass, | ||
120 | uintf.bInterfaceProtocol); | ||
121 | printf("%11s: %2d - %s\n", "", j, class_name); | ||
122 | } | ||
123 | |||
124 | printf("\n"); | ||
125 | } | ||
126 | |||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | static int list_exported_devices(char *host) | ||
131 | { | ||
132 | int rc; | ||
133 | int sockfd; | ||
134 | |||
135 | sockfd = usbip_net_tcp_connect(host, usbip_port_string); | ||
136 | if (sockfd < 0) { | ||
137 | err("could not connect to %s:%s: %s", host, | ||
138 | usbip_port_string, gai_strerror(sockfd)); | ||
139 | return -1; | ||
140 | } | ||
141 | dbg("connected to %s:%s", host, usbip_port_string); | ||
142 | |||
143 | rc = get_exported_devices(host, sockfd); | ||
144 | if (rc < 0) { | ||
145 | err("failed to get device list from %s", host); | ||
146 | return -1; | ||
147 | } | ||
148 | |||
149 | close(sockfd); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | static void print_device(const char *busid, const char *vendor, | ||
155 | const char *product, bool parsable) | ||
156 | { | ||
157 | if (parsable) | ||
158 | printf("busid=%s#usbid=%.4s:%.4s#", busid, vendor, product); | ||
159 | else | ||
160 | printf(" - busid %s (%.4s:%.4s)\n", busid, vendor, product); | ||
161 | } | ||
162 | |||
163 | static void print_product_name(char *product_name, bool parsable) | ||
164 | { | ||
165 | if (!parsable) | ||
166 | printf(" %s\n", product_name); | ||
167 | } | ||
168 | |||
169 | static int list_devices(bool parsable) | ||
170 | { | ||
171 | struct udev *udev; | ||
172 | struct udev_enumerate *enumerate; | ||
173 | struct udev_list_entry *devices, *dev_list_entry; | ||
174 | struct udev_device *dev; | ||
175 | const char *path; | ||
176 | const char *idVendor; | ||
177 | const char *idProduct; | ||
178 | const char *bConfValue; | ||
179 | const char *bNumIntfs; | ||
180 | const char *busid; | ||
181 | char product_name[128]; | ||
182 | int ret = -1; | ||
183 | |||
184 | /* Create libudev context. */ | ||
185 | udev = udev_new(); | ||
186 | |||
187 | /* Create libudev device enumeration. */ | ||
188 | enumerate = udev_enumerate_new(udev); | ||
189 | |||
190 | /* Take only USB devices that are not hubs and do not have | ||
191 | * the bInterfaceNumber attribute, i.e. are not interfaces. | ||
192 | */ | ||
193 | udev_enumerate_add_match_subsystem(enumerate, "usb"); | ||
194 | udev_enumerate_add_nomatch_sysattr(enumerate, "bDeviceClass", "09"); | ||
195 | udev_enumerate_add_nomatch_sysattr(enumerate, "bInterfaceNumber", NULL); | ||
196 | udev_enumerate_scan_devices(enumerate); | ||
197 | |||
198 | devices = udev_enumerate_get_list_entry(enumerate); | ||
199 | |||
200 | /* Show information about each device. */ | ||
201 | udev_list_entry_foreach(dev_list_entry, devices) { | ||
202 | path = udev_list_entry_get_name(dev_list_entry); | ||
203 | dev = udev_device_new_from_syspath(udev, path); | ||
204 | |||
205 | /* Get device information. */ | ||
206 | idVendor = udev_device_get_sysattr_value(dev, "idVendor"); | ||
207 | idProduct = udev_device_get_sysattr_value(dev, "idProduct"); | ||
208 | bConfValue = udev_device_get_sysattr_value(dev, "bConfigurationValue"); | ||
209 | bNumIntfs = udev_device_get_sysattr_value(dev, "bNumInterfaces"); | ||
210 | busid = udev_device_get_sysname(dev); | ||
211 | if (!idVendor || !idProduct || !bConfValue || !bNumIntfs) { | ||
212 | err("problem getting device attributes: %s", | ||
213 | strerror(errno)); | ||
214 | goto err_out; | ||
215 | } | ||
216 | |||
217 | /* Get product name. */ | ||
218 | usbip_names_get_product(product_name, sizeof(product_name), | ||
219 | strtol(idVendor, NULL, 16), | ||
220 | strtol(idProduct, NULL, 16)); | ||
221 | |||
222 | /* Print information. */ | ||
223 | print_device(busid, idVendor, idProduct, parsable); | ||
224 | print_product_name(product_name, parsable); | ||
225 | |||
226 | printf("\n"); | ||
227 | |||
228 | udev_device_unref(dev); | ||
229 | } | ||
230 | |||
231 | ret = 0; | ||
232 | |||
233 | err_out: | ||
234 | udev_enumerate_unref(enumerate); | ||
235 | udev_unref(udev); | ||
236 | |||
237 | return ret; | ||
238 | } | ||
239 | |||
240 | int usbip_list(int argc, char *argv[]) | ||
241 | { | ||
242 | static const struct option opts[] = { | ||
243 | { "parsable", no_argument, NULL, 'p' }, | ||
244 | { "remote", required_argument, NULL, 'r' }, | ||
245 | { "local", no_argument, NULL, 'l' }, | ||
246 | { NULL, 0, NULL, 0 } | ||
247 | }; | ||
248 | |||
249 | bool parsable = false; | ||
250 | int opt; | ||
251 | int ret = -1; | ||
252 | |||
253 | if (usbip_names_init(USBIDS_FILE)) | ||
254 | err("failed to open %s", USBIDS_FILE); | ||
255 | |||
256 | for (;;) { | ||
257 | opt = getopt_long(argc, argv, "pr:l", opts, NULL); | ||
258 | |||
259 | if (opt == -1) | ||
260 | break; | ||
261 | |||
262 | switch (opt) { | ||
263 | case 'p': | ||
264 | parsable = true; | ||
265 | break; | ||
266 | case 'r': | ||
267 | ret = list_exported_devices(optarg); | ||
268 | goto out; | ||
269 | case 'l': | ||
270 | ret = list_devices(parsable); | ||
271 | goto out; | ||
272 | default: | ||
273 | goto err_out; | ||
274 | } | ||
275 | } | ||
276 | |||
277 | err_out: | ||
278 | usbip_list_usage(); | ||
279 | out: | ||
280 | usbip_names_free(); | ||
281 | |||
282 | return ret; | ||
283 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_network.c b/drivers/staging/usbip/userspace/src/usbip_network.c deleted file mode 100644 index b4c37e76a6e0..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_network.c +++ /dev/null | |||
@@ -1,303 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <sys/socket.h> | ||
20 | |||
21 | #include <string.h> | ||
22 | |||
23 | #include <arpa/inet.h> | ||
24 | #include <netdb.h> | ||
25 | #include <netinet/tcp.h> | ||
26 | #include <unistd.h> | ||
27 | |||
28 | #ifdef HAVE_LIBWRAP | ||
29 | #include <tcpd.h> | ||
30 | #endif | ||
31 | |||
32 | #include "usbip_common.h" | ||
33 | #include "usbip_network.h" | ||
34 | |||
35 | int usbip_port = 3240; | ||
36 | char *usbip_port_string = "3240"; | ||
37 | |||
38 | void usbip_setup_port_number(char *arg) | ||
39 | { | ||
40 | dbg("parsing port arg '%s'", arg); | ||
41 | char *end; | ||
42 | unsigned long int port = strtoul(arg, &end, 10); | ||
43 | |||
44 | if (end == arg) { | ||
45 | err("port: could not parse '%s' as a decimal integer", arg); | ||
46 | return; | ||
47 | } | ||
48 | |||
49 | if (*end != '\0') { | ||
50 | err("port: garbage at end of '%s'", arg); | ||
51 | return; | ||
52 | } | ||
53 | |||
54 | if (port > UINT16_MAX) { | ||
55 | err("port: %s too high (max=%d)", | ||
56 | arg, UINT16_MAX); | ||
57 | return; | ||
58 | } | ||
59 | |||
60 | usbip_port = port; | ||
61 | usbip_port_string = arg; | ||
62 | info("using port %d (\"%s\")", usbip_port, usbip_port_string); | ||
63 | } | ||
64 | |||
65 | void usbip_net_pack_uint32_t(int pack, uint32_t *num) | ||
66 | { | ||
67 | uint32_t i; | ||
68 | |||
69 | if (pack) | ||
70 | i = htonl(*num); | ||
71 | else | ||
72 | i = ntohl(*num); | ||
73 | |||
74 | *num = i; | ||
75 | } | ||
76 | |||
77 | void usbip_net_pack_uint16_t(int pack, uint16_t *num) | ||
78 | { | ||
79 | uint16_t i; | ||
80 | |||
81 | if (pack) | ||
82 | i = htons(*num); | ||
83 | else | ||
84 | i = ntohs(*num); | ||
85 | |||
86 | *num = i; | ||
87 | } | ||
88 | |||
89 | void usbip_net_pack_usb_device(int pack, struct usbip_usb_device *udev) | ||
90 | { | ||
91 | usbip_net_pack_uint32_t(pack, &udev->busnum); | ||
92 | usbip_net_pack_uint32_t(pack, &udev->devnum); | ||
93 | usbip_net_pack_uint32_t(pack, &udev->speed); | ||
94 | |||
95 | usbip_net_pack_uint16_t(pack, &udev->idVendor); | ||
96 | usbip_net_pack_uint16_t(pack, &udev->idProduct); | ||
97 | usbip_net_pack_uint16_t(pack, &udev->bcdDevice); | ||
98 | } | ||
99 | |||
100 | void usbip_net_pack_usb_interface(int pack __attribute__((unused)), | ||
101 | struct usbip_usb_interface *udev | ||
102 | __attribute__((unused))) | ||
103 | { | ||
104 | /* uint8_t members need nothing */ | ||
105 | } | ||
106 | |||
107 | static ssize_t usbip_net_xmit(int sockfd, void *buff, size_t bufflen, | ||
108 | int sending) | ||
109 | { | ||
110 | ssize_t nbytes; | ||
111 | ssize_t total = 0; | ||
112 | |||
113 | if (!bufflen) | ||
114 | return 0; | ||
115 | |||
116 | do { | ||
117 | if (sending) | ||
118 | nbytes = send(sockfd, buff, bufflen, 0); | ||
119 | else | ||
120 | nbytes = recv(sockfd, buff, bufflen, MSG_WAITALL); | ||
121 | |||
122 | if (nbytes <= 0) | ||
123 | return -1; | ||
124 | |||
125 | buff = (void *)((intptr_t) buff + nbytes); | ||
126 | bufflen -= nbytes; | ||
127 | total += nbytes; | ||
128 | |||
129 | } while (bufflen > 0); | ||
130 | |||
131 | return total; | ||
132 | } | ||
133 | |||
134 | ssize_t usbip_net_recv(int sockfd, void *buff, size_t bufflen) | ||
135 | { | ||
136 | return usbip_net_xmit(sockfd, buff, bufflen, 0); | ||
137 | } | ||
138 | |||
139 | ssize_t usbip_net_send(int sockfd, void *buff, size_t bufflen) | ||
140 | { | ||
141 | return usbip_net_xmit(sockfd, buff, bufflen, 1); | ||
142 | } | ||
143 | |||
144 | int usbip_net_send_op_common(int sockfd, uint32_t code, uint32_t status) | ||
145 | { | ||
146 | struct op_common op_common; | ||
147 | int rc; | ||
148 | |||
149 | memset(&op_common, 0, sizeof(op_common)); | ||
150 | |||
151 | op_common.version = USBIP_VERSION; | ||
152 | op_common.code = code; | ||
153 | op_common.status = status; | ||
154 | |||
155 | PACK_OP_COMMON(1, &op_common); | ||
156 | |||
157 | rc = usbip_net_send(sockfd, &op_common, sizeof(op_common)); | ||
158 | if (rc < 0) { | ||
159 | dbg("usbip_net_send failed: %d", rc); | ||
160 | return -1; | ||
161 | } | ||
162 | |||
163 | return 0; | ||
164 | } | ||
165 | |||
166 | int usbip_net_recv_op_common(int sockfd, uint16_t *code) | ||
167 | { | ||
168 | struct op_common op_common; | ||
169 | int rc; | ||
170 | |||
171 | memset(&op_common, 0, sizeof(op_common)); | ||
172 | |||
173 | rc = usbip_net_recv(sockfd, &op_common, sizeof(op_common)); | ||
174 | if (rc < 0) { | ||
175 | dbg("usbip_net_recv failed: %d", rc); | ||
176 | goto err; | ||
177 | } | ||
178 | |||
179 | PACK_OP_COMMON(0, &op_common); | ||
180 | |||
181 | if (op_common.version != USBIP_VERSION) { | ||
182 | dbg("version mismatch: %d %d", op_common.version, | ||
183 | USBIP_VERSION); | ||
184 | goto err; | ||
185 | } | ||
186 | |||
187 | switch (*code) { | ||
188 | case OP_UNSPEC: | ||
189 | break; | ||
190 | default: | ||
191 | if (op_common.code != *code) { | ||
192 | dbg("unexpected pdu %#0x for %#0x", op_common.code, | ||
193 | *code); | ||
194 | goto err; | ||
195 | } | ||
196 | } | ||
197 | |||
198 | if (op_common.status != ST_OK) { | ||
199 | dbg("request failed at peer: %d", op_common.status); | ||
200 | goto err; | ||
201 | } | ||
202 | |||
203 | *code = op_common.code; | ||
204 | |||
205 | return 0; | ||
206 | err: | ||
207 | return -1; | ||
208 | } | ||
209 | |||
210 | int usbip_net_set_reuseaddr(int sockfd) | ||
211 | { | ||
212 | const int val = 1; | ||
213 | int ret; | ||
214 | |||
215 | ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); | ||
216 | if (ret < 0) | ||
217 | dbg("setsockopt: SO_REUSEADDR"); | ||
218 | |||
219 | return ret; | ||
220 | } | ||
221 | |||
222 | int usbip_net_set_nodelay(int sockfd) | ||
223 | { | ||
224 | const int val = 1; | ||
225 | int ret; | ||
226 | |||
227 | ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)); | ||
228 | if (ret < 0) | ||
229 | dbg("setsockopt: TCP_NODELAY"); | ||
230 | |||
231 | return ret; | ||
232 | } | ||
233 | |||
234 | int usbip_net_set_keepalive(int sockfd) | ||
235 | { | ||
236 | const int val = 1; | ||
237 | int ret; | ||
238 | |||
239 | ret = setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)); | ||
240 | if (ret < 0) | ||
241 | dbg("setsockopt: SO_KEEPALIVE"); | ||
242 | |||
243 | return ret; | ||
244 | } | ||
245 | |||
246 | int usbip_net_set_v6only(int sockfd) | ||
247 | { | ||
248 | const int val = 1; | ||
249 | int ret; | ||
250 | |||
251 | ret = setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); | ||
252 | if (ret < 0) | ||
253 | dbg("setsockopt: IPV6_V6ONLY"); | ||
254 | |||
255 | return ret; | ||
256 | } | ||
257 | |||
258 | /* | ||
259 | * IPv6 Ready | ||
260 | */ | ||
261 | int usbip_net_tcp_connect(char *hostname, char *service) | ||
262 | { | ||
263 | struct addrinfo hints, *res, *rp; | ||
264 | int sockfd; | ||
265 | int ret; | ||
266 | |||
267 | memset(&hints, 0, sizeof(hints)); | ||
268 | hints.ai_family = AF_UNSPEC; | ||
269 | hints.ai_socktype = SOCK_STREAM; | ||
270 | |||
271 | /* get all possible addresses */ | ||
272 | ret = getaddrinfo(hostname, service, &hints, &res); | ||
273 | if (ret < 0) { | ||
274 | dbg("getaddrinfo: %s service %s: %s", hostname, service, | ||
275 | gai_strerror(ret)); | ||
276 | return ret; | ||
277 | } | ||
278 | |||
279 | /* try the addresses */ | ||
280 | for (rp = res; rp; rp = rp->ai_next) { | ||
281 | sockfd = socket(rp->ai_family, rp->ai_socktype, | ||
282 | rp->ai_protocol); | ||
283 | if (sockfd < 0) | ||
284 | continue; | ||
285 | |||
286 | /* should set TCP_NODELAY for usbip */ | ||
287 | usbip_net_set_nodelay(sockfd); | ||
288 | /* TODO: write code for heartbeat */ | ||
289 | usbip_net_set_keepalive(sockfd); | ||
290 | |||
291 | if (connect(sockfd, rp->ai_addr, rp->ai_addrlen) == 0) | ||
292 | break; | ||
293 | |||
294 | close(sockfd); | ||
295 | } | ||
296 | |||
297 | freeaddrinfo(res); | ||
298 | |||
299 | if (!rp) | ||
300 | return EAI_SYSTEM; | ||
301 | |||
302 | return sockfd; | ||
303 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_network.h b/drivers/staging/usbip/userspace/src/usbip_network.h deleted file mode 100644 index c1e875cf1078..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_network.h +++ /dev/null | |||
@@ -1,185 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005-2007 Takahiro Hirofuchi | ||
3 | */ | ||
4 | |||
5 | #ifndef __USBIP_NETWORK_H | ||
6 | #define __USBIP_NETWORK_H | ||
7 | |||
8 | #ifdef HAVE_CONFIG_H | ||
9 | #include "../config.h" | ||
10 | #endif | ||
11 | |||
12 | #include <sys/types.h> | ||
13 | |||
14 | #include <stdint.h> | ||
15 | |||
16 | extern int usbip_port; | ||
17 | extern char *usbip_port_string; | ||
18 | void usbip_setup_port_number(char *arg); | ||
19 | |||
20 | /* ---------------------------------------------------------------------- */ | ||
21 | /* Common header for all the kinds of PDUs. */ | ||
22 | struct op_common { | ||
23 | uint16_t version; | ||
24 | |||
25 | #define OP_REQUEST (0x80 << 8) | ||
26 | #define OP_REPLY (0x00 << 8) | ||
27 | uint16_t code; | ||
28 | |||
29 | /* add more error code */ | ||
30 | #define ST_OK 0x00 | ||
31 | #define ST_NA 0x01 | ||
32 | uint32_t status; /* op_code status (for reply) */ | ||
33 | |||
34 | } __attribute__((packed)); | ||
35 | |||
36 | #define PACK_OP_COMMON(pack, op_common) do {\ | ||
37 | usbip_net_pack_uint16_t(pack, &(op_common)->version);\ | ||
38 | usbip_net_pack_uint16_t(pack, &(op_common)->code);\ | ||
39 | usbip_net_pack_uint32_t(pack, &(op_common)->status);\ | ||
40 | } while (0) | ||
41 | |||
42 | /* ---------------------------------------------------------------------- */ | ||
43 | /* Dummy Code */ | ||
44 | #define OP_UNSPEC 0x00 | ||
45 | #define OP_REQ_UNSPEC OP_UNSPEC | ||
46 | #define OP_REP_UNSPEC OP_UNSPEC | ||
47 | |||
48 | /* ---------------------------------------------------------------------- */ | ||
49 | /* Retrieve USB device information. (still not used) */ | ||
50 | #define OP_DEVINFO 0x02 | ||
51 | #define OP_REQ_DEVINFO (OP_REQUEST | OP_DEVINFO) | ||
52 | #define OP_REP_DEVINFO (OP_REPLY | OP_DEVINFO) | ||
53 | |||
54 | struct op_devinfo_request { | ||
55 | char busid[SYSFS_BUS_ID_SIZE]; | ||
56 | } __attribute__((packed)); | ||
57 | |||
58 | struct op_devinfo_reply { | ||
59 | struct usbip_usb_device udev; | ||
60 | struct usbip_usb_interface uinf[]; | ||
61 | } __attribute__((packed)); | ||
62 | |||
63 | /* ---------------------------------------------------------------------- */ | ||
64 | /* Import a remote USB device. */ | ||
65 | #define OP_IMPORT 0x03 | ||
66 | #define OP_REQ_IMPORT (OP_REQUEST | OP_IMPORT) | ||
67 | #define OP_REP_IMPORT (OP_REPLY | OP_IMPORT) | ||
68 | |||
69 | struct op_import_request { | ||
70 | char busid[SYSFS_BUS_ID_SIZE]; | ||
71 | } __attribute__((packed)); | ||
72 | |||
73 | struct op_import_reply { | ||
74 | struct usbip_usb_device udev; | ||
75 | // struct usbip_usb_interface uinf[]; | ||
76 | } __attribute__((packed)); | ||
77 | |||
78 | #define PACK_OP_IMPORT_REQUEST(pack, request) do {\ | ||
79 | } while (0) | ||
80 | |||
81 | #define PACK_OP_IMPORT_REPLY(pack, reply) do {\ | ||
82 | usbip_net_pack_usb_device(pack, &(reply)->udev);\ | ||
83 | } while (0) | ||
84 | |||
85 | /* ---------------------------------------------------------------------- */ | ||
86 | /* Export a USB device to a remote host. */ | ||
87 | #define OP_EXPORT 0x06 | ||
88 | #define OP_REQ_EXPORT (OP_REQUEST | OP_EXPORT) | ||
89 | #define OP_REP_EXPORT (OP_REPLY | OP_EXPORT) | ||
90 | |||
91 | struct op_export_request { | ||
92 | struct usbip_usb_device udev; | ||
93 | } __attribute__((packed)); | ||
94 | |||
95 | struct op_export_reply { | ||
96 | int returncode; | ||
97 | } __attribute__((packed)); | ||
98 | |||
99 | |||
100 | #define PACK_OP_EXPORT_REQUEST(pack, request) do {\ | ||
101 | usbip_net_pack_usb_device(pack, &(request)->udev);\ | ||
102 | } while (0) | ||
103 | |||
104 | #define PACK_OP_EXPORT_REPLY(pack, reply) do {\ | ||
105 | } while (0) | ||
106 | |||
107 | /* ---------------------------------------------------------------------- */ | ||
108 | /* un-Export a USB device from a remote host. */ | ||
109 | #define OP_UNEXPORT 0x07 | ||
110 | #define OP_REQ_UNEXPORT (OP_REQUEST | OP_UNEXPORT) | ||
111 | #define OP_REP_UNEXPORT (OP_REPLY | OP_UNEXPORT) | ||
112 | |||
113 | struct op_unexport_request { | ||
114 | struct usbip_usb_device udev; | ||
115 | } __attribute__((packed)); | ||
116 | |||
117 | struct op_unexport_reply { | ||
118 | int returncode; | ||
119 | } __attribute__((packed)); | ||
120 | |||
121 | #define PACK_OP_UNEXPORT_REQUEST(pack, request) do {\ | ||
122 | usbip_net_pack_usb_device(pack, &(request)->udev);\ | ||
123 | } while (0) | ||
124 | |||
125 | #define PACK_OP_UNEXPORT_REPLY(pack, reply) do {\ | ||
126 | } while (0) | ||
127 | |||
128 | /* ---------------------------------------------------------------------- */ | ||
129 | /* Negotiate IPSec encryption key. (still not used) */ | ||
130 | #define OP_CRYPKEY 0x04 | ||
131 | #define OP_REQ_CRYPKEY (OP_REQUEST | OP_CRYPKEY) | ||
132 | #define OP_REP_CRYPKEY (OP_REPLY | OP_CRYPKEY) | ||
133 | |||
134 | struct op_crypkey_request { | ||
135 | /* 128bit key */ | ||
136 | uint32_t key[4]; | ||
137 | } __attribute__((packed)); | ||
138 | |||
139 | struct op_crypkey_reply { | ||
140 | uint32_t __reserved; | ||
141 | } __attribute__((packed)); | ||
142 | |||
143 | |||
144 | /* ---------------------------------------------------------------------- */ | ||
145 | /* Retrieve the list of exported USB devices. */ | ||
146 | #define OP_DEVLIST 0x05 | ||
147 | #define OP_REQ_DEVLIST (OP_REQUEST | OP_DEVLIST) | ||
148 | #define OP_REP_DEVLIST (OP_REPLY | OP_DEVLIST) | ||
149 | |||
150 | struct op_devlist_request { | ||
151 | } __attribute__((packed)); | ||
152 | |||
153 | struct op_devlist_reply { | ||
154 | uint32_t ndev; | ||
155 | /* followed by reply_extra[] */ | ||
156 | } __attribute__((packed)); | ||
157 | |||
158 | struct op_devlist_reply_extra { | ||
159 | struct usbip_usb_device udev; | ||
160 | struct usbip_usb_interface uinf[]; | ||
161 | } __attribute__((packed)); | ||
162 | |||
163 | #define PACK_OP_DEVLIST_REQUEST(pack, request) do {\ | ||
164 | } while (0) | ||
165 | |||
166 | #define PACK_OP_DEVLIST_REPLY(pack, reply) do {\ | ||
167 | usbip_net_pack_uint32_t(pack, &(reply)->ndev);\ | ||
168 | } while (0) | ||
169 | |||
170 | void usbip_net_pack_uint32_t(int pack, uint32_t *num); | ||
171 | void usbip_net_pack_uint16_t(int pack, uint16_t *num); | ||
172 | void usbip_net_pack_usb_device(int pack, struct usbip_usb_device *udev); | ||
173 | void usbip_net_pack_usb_interface(int pack, struct usbip_usb_interface *uinf); | ||
174 | |||
175 | ssize_t usbip_net_recv(int sockfd, void *buff, size_t bufflen); | ||
176 | ssize_t usbip_net_send(int sockfd, void *buff, size_t bufflen); | ||
177 | int usbip_net_send_op_common(int sockfd, uint32_t code, uint32_t status); | ||
178 | int usbip_net_recv_op_common(int sockfd, uint16_t *code); | ||
179 | int usbip_net_set_reuseaddr(int sockfd); | ||
180 | int usbip_net_set_nodelay(int sockfd); | ||
181 | int usbip_net_set_keepalive(int sockfd); | ||
182 | int usbip_net_set_v6only(int sockfd); | ||
183 | int usbip_net_tcp_connect(char *hostname, char *port); | ||
184 | |||
185 | #endif /* __USBIP_NETWORK_H */ | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_port.c b/drivers/staging/usbip/userspace/src/usbip_port.c deleted file mode 100644 index a2e884fd9226..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_port.c +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | */ | ||
15 | |||
16 | #include "vhci_driver.h" | ||
17 | #include "usbip_common.h" | ||
18 | |||
19 | static int list_imported_devices(void) | ||
20 | { | ||
21 | int i; | ||
22 | struct usbip_imported_device *idev; | ||
23 | int ret; | ||
24 | |||
25 | ret = usbip_vhci_driver_open(); | ||
26 | if (ret < 0) { | ||
27 | err("open vhci_driver"); | ||
28 | return -1; | ||
29 | } | ||
30 | |||
31 | printf("Imported USB devices\n"); | ||
32 | printf("====================\n"); | ||
33 | |||
34 | for (i = 0; i < vhci_driver->nports; i++) { | ||
35 | idev = &vhci_driver->idev[i]; | ||
36 | |||
37 | if (usbip_vhci_imported_device_dump(idev) < 0) | ||
38 | ret = -1; | ||
39 | } | ||
40 | |||
41 | usbip_vhci_driver_close(); | ||
42 | |||
43 | return ret; | ||
44 | |||
45 | } | ||
46 | |||
47 | int usbip_port_show(__attribute__((unused)) int argc, | ||
48 | __attribute__((unused)) char *argv[]) | ||
49 | { | ||
50 | int ret; | ||
51 | |||
52 | ret = list_imported_devices(); | ||
53 | if (ret < 0) | ||
54 | err("list imported devices"); | ||
55 | |||
56 | return ret; | ||
57 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbip_unbind.c b/drivers/staging/usbip/userspace/src/usbip_unbind.c deleted file mode 100644 index a4a496c9cbaf..000000000000 --- a/drivers/staging/usbip/userspace/src/usbip_unbind.c +++ /dev/null | |||
@@ -1,141 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <libudev.h> | ||
20 | |||
21 | #include <errno.h> | ||
22 | #include <stdio.h> | ||
23 | #include <string.h> | ||
24 | |||
25 | #include <getopt.h> | ||
26 | |||
27 | #include "usbip_common.h" | ||
28 | #include "utils.h" | ||
29 | #include "usbip.h" | ||
30 | #include "sysfs_utils.h" | ||
31 | |||
32 | static const char usbip_unbind_usage_string[] = | ||
33 | "usbip unbind <args>\n" | ||
34 | " -b, --busid=<busid> Unbind " USBIP_HOST_DRV_NAME ".ko from " | ||
35 | "device on <busid>\n"; | ||
36 | |||
37 | void usbip_unbind_usage(void) | ||
38 | { | ||
39 | printf("usage: %s", usbip_unbind_usage_string); | ||
40 | } | ||
41 | |||
42 | static int unbind_device(char *busid) | ||
43 | { | ||
44 | char bus_type[] = "usb"; | ||
45 | int rc, ret = -1; | ||
46 | |||
47 | char unbind_attr_name[] = "unbind"; | ||
48 | char unbind_attr_path[SYSFS_PATH_MAX]; | ||
49 | char rebind_attr_name[] = "rebind"; | ||
50 | char rebind_attr_path[SYSFS_PATH_MAX]; | ||
51 | |||
52 | struct udev *udev; | ||
53 | struct udev_device *dev; | ||
54 | const char *driver; | ||
55 | |||
56 | /* Create libudev context. */ | ||
57 | udev = udev_new(); | ||
58 | |||
59 | /* Check whether the device with this bus ID exists. */ | ||
60 | dev = udev_device_new_from_subsystem_sysname(udev, "usb", busid); | ||
61 | if (!dev) { | ||
62 | err("device with the specified bus ID does not exist"); | ||
63 | goto err_close_udev; | ||
64 | } | ||
65 | |||
66 | /* Check whether the device is using usbip-host driver. */ | ||
67 | driver = udev_device_get_driver(dev); | ||
68 | if (!driver || strcmp(driver, "usbip-host")) { | ||
69 | err("device is not bound to usbip-host driver"); | ||
70 | goto err_close_udev; | ||
71 | } | ||
72 | |||
73 | /* Unbind device from driver. */ | ||
74 | snprintf(unbind_attr_path, sizeof(unbind_attr_path), "%s/%s/%s/%s/%s/%s", | ||
75 | SYSFS_MNT_PATH, SYSFS_BUS_NAME, bus_type, SYSFS_DRIVERS_NAME, | ||
76 | USBIP_HOST_DRV_NAME, unbind_attr_name); | ||
77 | |||
78 | rc = write_sysfs_attribute(unbind_attr_path, busid, strlen(busid)); | ||
79 | if (rc < 0) { | ||
80 | err("error unbinding device %s from driver", busid); | ||
81 | goto err_close_udev; | ||
82 | } | ||
83 | |||
84 | /* Notify driver of unbind. */ | ||
85 | rc = modify_match_busid(busid, 0); | ||
86 | if (rc < 0) { | ||
87 | err("unable to unbind device on %s", busid); | ||
88 | goto err_close_udev; | ||
89 | } | ||
90 | |||
91 | /* Trigger new probing. */ | ||
92 | snprintf(rebind_attr_path, sizeof(unbind_attr_path), "%s/%s/%s/%s/%s/%s", | ||
93 | SYSFS_MNT_PATH, SYSFS_BUS_NAME, bus_type, SYSFS_DRIVERS_NAME, | ||
94 | USBIP_HOST_DRV_NAME, rebind_attr_name); | ||
95 | |||
96 | rc = write_sysfs_attribute(rebind_attr_path, busid, strlen(busid)); | ||
97 | if (rc < 0) { | ||
98 | err("error rebinding"); | ||
99 | goto err_close_udev; | ||
100 | } | ||
101 | |||
102 | ret = 0; | ||
103 | info("unbind device on busid %s: complete", busid); | ||
104 | |||
105 | err_close_udev: | ||
106 | udev_device_unref(dev); | ||
107 | udev_unref(udev); | ||
108 | |||
109 | return ret; | ||
110 | } | ||
111 | |||
112 | int usbip_unbind(int argc, char *argv[]) | ||
113 | { | ||
114 | static const struct option opts[] = { | ||
115 | { "busid", required_argument, NULL, 'b' }, | ||
116 | { NULL, 0, NULL, 0 } | ||
117 | }; | ||
118 | |||
119 | int opt; | ||
120 | int ret = -1; | ||
121 | |||
122 | for (;;) { | ||
123 | opt = getopt_long(argc, argv, "b:", opts, NULL); | ||
124 | |||
125 | if (opt == -1) | ||
126 | break; | ||
127 | |||
128 | switch (opt) { | ||
129 | case 'b': | ||
130 | ret = unbind_device(optarg); | ||
131 | goto out; | ||
132 | default: | ||
133 | goto err_out; | ||
134 | } | ||
135 | } | ||
136 | |||
137 | err_out: | ||
138 | usbip_unbind_usage(); | ||
139 | out: | ||
140 | return ret; | ||
141 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/usbipd.c b/drivers/staging/usbip/userspace/src/usbipd.c deleted file mode 100644 index 2f87f2d348ba..000000000000 --- a/drivers/staging/usbip/userspace/src/usbipd.c +++ /dev/null | |||
@@ -1,679 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #ifdef HAVE_CONFIG_H | ||
20 | #include "../config.h" | ||
21 | #endif | ||
22 | |||
23 | #define _GNU_SOURCE | ||
24 | #include <errno.h> | ||
25 | #include <unistd.h> | ||
26 | #include <netdb.h> | ||
27 | #include <string.h> | ||
28 | #include <stdlib.h> | ||
29 | #include <sys/types.h> | ||
30 | #include <sys/stat.h> | ||
31 | #include <arpa/inet.h> | ||
32 | #include <sys/socket.h> | ||
33 | #include <netinet/in.h> | ||
34 | |||
35 | #ifdef HAVE_LIBWRAP | ||
36 | #include <tcpd.h> | ||
37 | #endif | ||
38 | |||
39 | #include <getopt.h> | ||
40 | #include <signal.h> | ||
41 | #include <poll.h> | ||
42 | |||
43 | #include "usbip_host_driver.h" | ||
44 | #include "usbip_common.h" | ||
45 | #include "usbip_network.h" | ||
46 | #include "list.h" | ||
47 | |||
48 | #undef PROGNAME | ||
49 | #define PROGNAME "usbipd" | ||
50 | #define MAXSOCKFD 20 | ||
51 | |||
52 | #define MAIN_LOOP_TIMEOUT 10 | ||
53 | |||
54 | #define DEFAULT_PID_FILE "/var/run/" PROGNAME ".pid" | ||
55 | |||
56 | static const char usbip_version_string[] = PACKAGE_STRING; | ||
57 | |||
58 | static const char usbipd_help_string[] = | ||
59 | "usage: usbipd [options]\n" | ||
60 | "\n" | ||
61 | " -4, --ipv4\n" | ||
62 | " Bind to IPv4. Default is both.\n" | ||
63 | "\n" | ||
64 | " -6, --ipv6\n" | ||
65 | " Bind to IPv6. Default is both.\n" | ||
66 | "\n" | ||
67 | " -D, --daemon\n" | ||
68 | " Run as a daemon process.\n" | ||
69 | "\n" | ||
70 | " -d, --debug\n" | ||
71 | " Print debugging information.\n" | ||
72 | "\n" | ||
73 | " -PFILE, --pid FILE\n" | ||
74 | " Write process id to FILE.\n" | ||
75 | " If no FILE specified, use " DEFAULT_PID_FILE "\n" | ||
76 | "\n" | ||
77 | " -tPORT, --tcp-port PORT\n" | ||
78 | " Listen on TCP/IP port PORT.\n" | ||
79 | "\n" | ||
80 | " -h, --help\n" | ||
81 | " Print this help.\n" | ||
82 | "\n" | ||
83 | " -v, --version\n" | ||
84 | " Show version.\n"; | ||
85 | |||
86 | static void usbipd_help(void) | ||
87 | { | ||
88 | printf("%s\n", usbipd_help_string); | ||
89 | } | ||
90 | |||
91 | static int recv_request_import(int sockfd) | ||
92 | { | ||
93 | struct op_import_request req; | ||
94 | struct op_common reply; | ||
95 | struct usbip_exported_device *edev; | ||
96 | struct usbip_usb_device pdu_udev; | ||
97 | struct list_head *i; | ||
98 | int found = 0; | ||
99 | int error = 0; | ||
100 | int rc; | ||
101 | |||
102 | memset(&req, 0, sizeof(req)); | ||
103 | memset(&reply, 0, sizeof(reply)); | ||
104 | |||
105 | rc = usbip_net_recv(sockfd, &req, sizeof(req)); | ||
106 | if (rc < 0) { | ||
107 | dbg("usbip_net_recv failed: import request"); | ||
108 | return -1; | ||
109 | } | ||
110 | PACK_OP_IMPORT_REQUEST(0, &req); | ||
111 | |||
112 | list_for_each(i, &host_driver->edev_list) { | ||
113 | edev = list_entry(i, struct usbip_exported_device, node); | ||
114 | if (!strncmp(req.busid, edev->udev.busid, SYSFS_BUS_ID_SIZE)) { | ||
115 | info("found requested device: %s", req.busid); | ||
116 | found = 1; | ||
117 | break; | ||
118 | } | ||
119 | } | ||
120 | |||
121 | if (found) { | ||
122 | /* should set TCP_NODELAY for usbip */ | ||
123 | usbip_net_set_nodelay(sockfd); | ||
124 | |||
125 | /* export device needs a TCP/IP socket descriptor */ | ||
126 | rc = usbip_host_export_device(edev, sockfd); | ||
127 | if (rc < 0) | ||
128 | error = 1; | ||
129 | } else { | ||
130 | info("requested device not found: %s", req.busid); | ||
131 | error = 1; | ||
132 | } | ||
133 | |||
134 | rc = usbip_net_send_op_common(sockfd, OP_REP_IMPORT, | ||
135 | (!error ? ST_OK : ST_NA)); | ||
136 | if (rc < 0) { | ||
137 | dbg("usbip_net_send_op_common failed: %#0x", OP_REP_IMPORT); | ||
138 | return -1; | ||
139 | } | ||
140 | |||
141 | if (error) { | ||
142 | dbg("import request busid %s: failed", req.busid); | ||
143 | return -1; | ||
144 | } | ||
145 | |||
146 | memcpy(&pdu_udev, &edev->udev, sizeof(pdu_udev)); | ||
147 | usbip_net_pack_usb_device(1, &pdu_udev); | ||
148 | |||
149 | rc = usbip_net_send(sockfd, &pdu_udev, sizeof(pdu_udev)); | ||
150 | if (rc < 0) { | ||
151 | dbg("usbip_net_send failed: devinfo"); | ||
152 | return -1; | ||
153 | } | ||
154 | |||
155 | dbg("import request busid %s: complete", req.busid); | ||
156 | |||
157 | return 0; | ||
158 | } | ||
159 | |||
160 | static int send_reply_devlist(int connfd) | ||
161 | { | ||
162 | struct usbip_exported_device *edev; | ||
163 | struct usbip_usb_device pdu_udev; | ||
164 | struct usbip_usb_interface pdu_uinf; | ||
165 | struct op_devlist_reply reply; | ||
166 | struct list_head *j; | ||
167 | int rc, i; | ||
168 | |||
169 | reply.ndev = 0; | ||
170 | /* number of exported devices */ | ||
171 | list_for_each(j, &host_driver->edev_list) { | ||
172 | reply.ndev += 1; | ||
173 | } | ||
174 | info("exportable devices: %d", reply.ndev); | ||
175 | |||
176 | rc = usbip_net_send_op_common(connfd, OP_REP_DEVLIST, ST_OK); | ||
177 | if (rc < 0) { | ||
178 | dbg("usbip_net_send_op_common failed: %#0x", OP_REP_DEVLIST); | ||
179 | return -1; | ||
180 | } | ||
181 | PACK_OP_DEVLIST_REPLY(1, &reply); | ||
182 | |||
183 | rc = usbip_net_send(connfd, &reply, sizeof(reply)); | ||
184 | if (rc < 0) { | ||
185 | dbg("usbip_net_send failed: %#0x", OP_REP_DEVLIST); | ||
186 | return -1; | ||
187 | } | ||
188 | |||
189 | list_for_each(j, &host_driver->edev_list) { | ||
190 | edev = list_entry(j, struct usbip_exported_device, node); | ||
191 | dump_usb_device(&edev->udev); | ||
192 | memcpy(&pdu_udev, &edev->udev, sizeof(pdu_udev)); | ||
193 | usbip_net_pack_usb_device(1, &pdu_udev); | ||
194 | |||
195 | rc = usbip_net_send(connfd, &pdu_udev, sizeof(pdu_udev)); | ||
196 | if (rc < 0) { | ||
197 | dbg("usbip_net_send failed: pdu_udev"); | ||
198 | return -1; | ||
199 | } | ||
200 | |||
201 | for (i = 0; i < edev->udev.bNumInterfaces; i++) { | ||
202 | dump_usb_interface(&edev->uinf[i]); | ||
203 | memcpy(&pdu_uinf, &edev->uinf[i], sizeof(pdu_uinf)); | ||
204 | usbip_net_pack_usb_interface(1, &pdu_uinf); | ||
205 | |||
206 | rc = usbip_net_send(connfd, &pdu_uinf, | ||
207 | sizeof(pdu_uinf)); | ||
208 | if (rc < 0) { | ||
209 | err("usbip_net_send failed: pdu_uinf"); | ||
210 | return -1; | ||
211 | } | ||
212 | } | ||
213 | } | ||
214 | |||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | static int recv_request_devlist(int connfd) | ||
219 | { | ||
220 | struct op_devlist_request req; | ||
221 | int rc; | ||
222 | |||
223 | memset(&req, 0, sizeof(req)); | ||
224 | |||
225 | rc = usbip_net_recv(connfd, &req, sizeof(req)); | ||
226 | if (rc < 0) { | ||
227 | dbg("usbip_net_recv failed: devlist request"); | ||
228 | return -1; | ||
229 | } | ||
230 | |||
231 | rc = send_reply_devlist(connfd); | ||
232 | if (rc < 0) { | ||
233 | dbg("send_reply_devlist failed"); | ||
234 | return -1; | ||
235 | } | ||
236 | |||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | static int recv_pdu(int connfd) | ||
241 | { | ||
242 | uint16_t code = OP_UNSPEC; | ||
243 | int ret; | ||
244 | |||
245 | ret = usbip_net_recv_op_common(connfd, &code); | ||
246 | if (ret < 0) { | ||
247 | dbg("could not receive opcode: %#0x", code); | ||
248 | return -1; | ||
249 | } | ||
250 | |||
251 | ret = usbip_host_refresh_device_list(); | ||
252 | if (ret < 0) { | ||
253 | dbg("could not refresh device list: %d", ret); | ||
254 | return -1; | ||
255 | } | ||
256 | |||
257 | info("received request: %#0x(%d)", code, connfd); | ||
258 | switch (code) { | ||
259 | case OP_REQ_DEVLIST: | ||
260 | ret = recv_request_devlist(connfd); | ||
261 | break; | ||
262 | case OP_REQ_IMPORT: | ||
263 | ret = recv_request_import(connfd); | ||
264 | break; | ||
265 | case OP_REQ_DEVINFO: | ||
266 | case OP_REQ_CRYPKEY: | ||
267 | default: | ||
268 | err("received an unknown opcode: %#0x", code); | ||
269 | ret = -1; | ||
270 | } | ||
271 | |||
272 | if (ret == 0) | ||
273 | info("request %#0x(%d): complete", code, connfd); | ||
274 | else | ||
275 | info("request %#0x(%d): failed", code, connfd); | ||
276 | |||
277 | return ret; | ||
278 | } | ||
279 | |||
280 | #ifdef HAVE_LIBWRAP | ||
281 | static int tcpd_auth(int connfd) | ||
282 | { | ||
283 | struct request_info request; | ||
284 | int rc; | ||
285 | |||
286 | request_init(&request, RQ_DAEMON, PROGNAME, RQ_FILE, connfd, 0); | ||
287 | fromhost(&request); | ||
288 | rc = hosts_access(&request); | ||
289 | if (rc == 0) | ||
290 | return -1; | ||
291 | |||
292 | return 0; | ||
293 | } | ||
294 | #endif | ||
295 | |||
296 | static int do_accept(int listenfd) | ||
297 | { | ||
298 | int connfd; | ||
299 | struct sockaddr_storage ss; | ||
300 | socklen_t len = sizeof(ss); | ||
301 | char host[NI_MAXHOST], port[NI_MAXSERV]; | ||
302 | int rc; | ||
303 | |||
304 | memset(&ss, 0, sizeof(ss)); | ||
305 | |||
306 | connfd = accept(listenfd, (struct sockaddr *)&ss, &len); | ||
307 | if (connfd < 0) { | ||
308 | err("failed to accept connection"); | ||
309 | return -1; | ||
310 | } | ||
311 | |||
312 | rc = getnameinfo((struct sockaddr *)&ss, len, host, sizeof(host), | ||
313 | port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); | ||
314 | if (rc) | ||
315 | err("getnameinfo: %s", gai_strerror(rc)); | ||
316 | |||
317 | #ifdef HAVE_LIBWRAP | ||
318 | rc = tcpd_auth(connfd); | ||
319 | if (rc < 0) { | ||
320 | info("denied access from %s", host); | ||
321 | close(connfd); | ||
322 | return -1; | ||
323 | } | ||
324 | #endif | ||
325 | info("connection from %s:%s", host, port); | ||
326 | |||
327 | return connfd; | ||
328 | } | ||
329 | |||
330 | int process_request(int listenfd) | ||
331 | { | ||
332 | pid_t childpid; | ||
333 | int connfd; | ||
334 | |||
335 | connfd = do_accept(listenfd); | ||
336 | if (connfd < 0) | ||
337 | return -1; | ||
338 | childpid = fork(); | ||
339 | if (childpid == 0) { | ||
340 | close(listenfd); | ||
341 | recv_pdu(connfd); | ||
342 | exit(0); | ||
343 | } | ||
344 | close(connfd); | ||
345 | return 0; | ||
346 | } | ||
347 | |||
348 | static void addrinfo_to_text(struct addrinfo *ai, char buf[], | ||
349 | const size_t buf_size) | ||
350 | { | ||
351 | char hbuf[NI_MAXHOST]; | ||
352 | char sbuf[NI_MAXSERV]; | ||
353 | int rc; | ||
354 | |||
355 | buf[0] = '\0'; | ||
356 | |||
357 | rc = getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf, sizeof(hbuf), | ||
358 | sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV); | ||
359 | if (rc) | ||
360 | err("getnameinfo: %s", gai_strerror(rc)); | ||
361 | |||
362 | snprintf(buf, buf_size, "%s:%s", hbuf, sbuf); | ||
363 | } | ||
364 | |||
365 | static int listen_all_addrinfo(struct addrinfo *ai_head, int sockfdlist[], | ||
366 | int maxsockfd) | ||
367 | { | ||
368 | struct addrinfo *ai; | ||
369 | int ret, nsockfd = 0; | ||
370 | const size_t ai_buf_size = NI_MAXHOST + NI_MAXSERV + 2; | ||
371 | char ai_buf[ai_buf_size]; | ||
372 | |||
373 | for (ai = ai_head; ai && nsockfd < maxsockfd; ai = ai->ai_next) { | ||
374 | int sock; | ||
375 | |||
376 | addrinfo_to_text(ai, ai_buf, ai_buf_size); | ||
377 | dbg("opening %s", ai_buf); | ||
378 | sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); | ||
379 | if (sock < 0) { | ||
380 | err("socket: %s: %d (%s)", | ||
381 | ai_buf, errno, strerror(errno)); | ||
382 | continue; | ||
383 | } | ||
384 | |||
385 | usbip_net_set_reuseaddr(sock); | ||
386 | usbip_net_set_nodelay(sock); | ||
387 | /* We use seperate sockets for IPv4 and IPv6 | ||
388 | * (see do_standalone_mode()) */ | ||
389 | usbip_net_set_v6only(sock); | ||
390 | |||
391 | if (sock >= FD_SETSIZE) { | ||
392 | err("FD_SETSIZE: %s: sock=%d, max=%d", | ||
393 | ai_buf, sock, FD_SETSIZE); | ||
394 | close(sock); | ||
395 | continue; | ||
396 | } | ||
397 | |||
398 | ret = bind(sock, ai->ai_addr, ai->ai_addrlen); | ||
399 | if (ret < 0) { | ||
400 | err("bind: %s: %d (%s)", | ||
401 | ai_buf, errno, strerror(errno)); | ||
402 | close(sock); | ||
403 | continue; | ||
404 | } | ||
405 | |||
406 | ret = listen(sock, SOMAXCONN); | ||
407 | if (ret < 0) { | ||
408 | err("listen: %s: %d (%s)", | ||
409 | ai_buf, errno, strerror(errno)); | ||
410 | close(sock); | ||
411 | continue; | ||
412 | } | ||
413 | |||
414 | info("listening on %s", ai_buf); | ||
415 | sockfdlist[nsockfd++] = sock; | ||
416 | } | ||
417 | |||
418 | return nsockfd; | ||
419 | } | ||
420 | |||
421 | static struct addrinfo *do_getaddrinfo(char *host, int ai_family) | ||
422 | { | ||
423 | struct addrinfo hints, *ai_head; | ||
424 | int rc; | ||
425 | |||
426 | memset(&hints, 0, sizeof(hints)); | ||
427 | hints.ai_family = ai_family; | ||
428 | hints.ai_socktype = SOCK_STREAM; | ||
429 | hints.ai_flags = AI_PASSIVE; | ||
430 | |||
431 | rc = getaddrinfo(host, usbip_port_string, &hints, &ai_head); | ||
432 | if (rc) { | ||
433 | err("failed to get a network address %s: %s", usbip_port_string, | ||
434 | gai_strerror(rc)); | ||
435 | return NULL; | ||
436 | } | ||
437 | |||
438 | return ai_head; | ||
439 | } | ||
440 | |||
441 | static void signal_handler(int i) | ||
442 | { | ||
443 | dbg("received '%s' signal", strsignal(i)); | ||
444 | } | ||
445 | |||
446 | static void set_signal(void) | ||
447 | { | ||
448 | struct sigaction act; | ||
449 | |||
450 | memset(&act, 0, sizeof(act)); | ||
451 | act.sa_handler = signal_handler; | ||
452 | sigemptyset(&act.sa_mask); | ||
453 | sigaction(SIGTERM, &act, NULL); | ||
454 | sigaction(SIGINT, &act, NULL); | ||
455 | act.sa_handler = SIG_IGN; | ||
456 | sigaction(SIGCLD, &act, NULL); | ||
457 | } | ||
458 | |||
459 | static const char *pid_file; | ||
460 | |||
461 | static void write_pid_file(void) | ||
462 | { | ||
463 | if (pid_file) { | ||
464 | dbg("creating pid file %s", pid_file); | ||
465 | FILE *fp; | ||
466 | |||
467 | fp = fopen(pid_file, "w"); | ||
468 | if (!fp) { | ||
469 | err("pid_file: %s: %d (%s)", | ||
470 | pid_file, errno, strerror(errno)); | ||
471 | return; | ||
472 | } | ||
473 | fprintf(fp, "%d\n", getpid()); | ||
474 | fclose(fp); | ||
475 | } | ||
476 | } | ||
477 | |||
478 | static void remove_pid_file(void) | ||
479 | { | ||
480 | if (pid_file) { | ||
481 | dbg("removing pid file %s", pid_file); | ||
482 | unlink(pid_file); | ||
483 | } | ||
484 | } | ||
485 | |||
486 | static int do_standalone_mode(int daemonize, int ipv4, int ipv6) | ||
487 | { | ||
488 | struct addrinfo *ai_head; | ||
489 | int sockfdlist[MAXSOCKFD]; | ||
490 | int nsockfd, family; | ||
491 | int i, terminate; | ||
492 | struct pollfd *fds; | ||
493 | struct timespec timeout; | ||
494 | sigset_t sigmask; | ||
495 | |||
496 | if (usbip_host_driver_open()) { | ||
497 | err("please load " USBIP_CORE_MOD_NAME ".ko and " | ||
498 | USBIP_HOST_DRV_NAME ".ko!"); | ||
499 | return -1; | ||
500 | } | ||
501 | |||
502 | if (daemonize) { | ||
503 | if (daemon(0, 0) < 0) { | ||
504 | err("daemonizing failed: %s", strerror(errno)); | ||
505 | usbip_host_driver_close(); | ||
506 | return -1; | ||
507 | } | ||
508 | umask(0); | ||
509 | usbip_use_syslog = 1; | ||
510 | } | ||
511 | set_signal(); | ||
512 | write_pid_file(); | ||
513 | |||
514 | info("starting " PROGNAME " (%s)", usbip_version_string); | ||
515 | |||
516 | /* | ||
517 | * To suppress warnings on systems with bindv6only disabled | ||
518 | * (default), we use seperate sockets for IPv6 and IPv4 and set | ||
519 | * IPV6_V6ONLY on the IPv6 sockets. | ||
520 | */ | ||
521 | if (ipv4 && ipv6) | ||
522 | family = AF_UNSPEC; | ||
523 | else if (ipv4) | ||
524 | family = AF_INET; | ||
525 | else | ||
526 | family = AF_INET6; | ||
527 | |||
528 | ai_head = do_getaddrinfo(NULL, family); | ||
529 | if (!ai_head) { | ||
530 | usbip_host_driver_close(); | ||
531 | return -1; | ||
532 | } | ||
533 | nsockfd = listen_all_addrinfo(ai_head, sockfdlist, | ||
534 | sizeof(sockfdlist) / sizeof(*sockfdlist)); | ||
535 | freeaddrinfo(ai_head); | ||
536 | if (nsockfd <= 0) { | ||
537 | err("failed to open a listening socket"); | ||
538 | usbip_host_driver_close(); | ||
539 | return -1; | ||
540 | } | ||
541 | |||
542 | dbg("listening on %d address%s", nsockfd, (nsockfd == 1) ? "" : "es"); | ||
543 | |||
544 | fds = calloc(nsockfd, sizeof(struct pollfd)); | ||
545 | for (i = 0; i < nsockfd; i++) { | ||
546 | fds[i].fd = sockfdlist[i]; | ||
547 | fds[i].events = POLLIN; | ||
548 | } | ||
549 | timeout.tv_sec = MAIN_LOOP_TIMEOUT; | ||
550 | timeout.tv_nsec = 0; | ||
551 | |||
552 | sigfillset(&sigmask); | ||
553 | sigdelset(&sigmask, SIGTERM); | ||
554 | sigdelset(&sigmask, SIGINT); | ||
555 | |||
556 | terminate = 0; | ||
557 | while (!terminate) { | ||
558 | int r; | ||
559 | |||
560 | r = ppoll(fds, nsockfd, &timeout, &sigmask); | ||
561 | if (r < 0) { | ||
562 | dbg("%s", strerror(errno)); | ||
563 | terminate = 1; | ||
564 | } else if (r) { | ||
565 | for (i = 0; i < nsockfd; i++) { | ||
566 | if (fds[i].revents & POLLIN) { | ||
567 | dbg("read event on fd[%d]=%d", | ||
568 | i, sockfdlist[i]); | ||
569 | process_request(sockfdlist[i]); | ||
570 | } | ||
571 | } | ||
572 | } else { | ||
573 | dbg("heartbeat timeout on ppoll()"); | ||
574 | } | ||
575 | } | ||
576 | |||
577 | info("shutting down " PROGNAME); | ||
578 | free(fds); | ||
579 | usbip_host_driver_close(); | ||
580 | |||
581 | return 0; | ||
582 | } | ||
583 | |||
584 | int main(int argc, char *argv[]) | ||
585 | { | ||
586 | static const struct option longopts[] = { | ||
587 | { "ipv4", no_argument, NULL, '4' }, | ||
588 | { "ipv6", no_argument, NULL, '6' }, | ||
589 | { "daemon", no_argument, NULL, 'D' }, | ||
590 | { "daemon", no_argument, NULL, 'D' }, | ||
591 | { "debug", no_argument, NULL, 'd' }, | ||
592 | { "pid", optional_argument, NULL, 'P' }, | ||
593 | { "tcp-port", required_argument, NULL, 't' }, | ||
594 | { "help", no_argument, NULL, 'h' }, | ||
595 | { "version", no_argument, NULL, 'v' }, | ||
596 | { NULL, 0, NULL, 0 } | ||
597 | }; | ||
598 | |||
599 | enum { | ||
600 | cmd_standalone_mode = 1, | ||
601 | cmd_help, | ||
602 | cmd_version | ||
603 | } cmd; | ||
604 | |||
605 | int daemonize = 0; | ||
606 | int ipv4 = 0, ipv6 = 0; | ||
607 | int opt, rc = -1; | ||
608 | |||
609 | pid_file = NULL; | ||
610 | |||
611 | usbip_use_stderr = 1; | ||
612 | usbip_use_syslog = 0; | ||
613 | |||
614 | if (geteuid() != 0) | ||
615 | err("not running as root?"); | ||
616 | |||
617 | cmd = cmd_standalone_mode; | ||
618 | for (;;) { | ||
619 | opt = getopt_long(argc, argv, "46DdP::t:hv", longopts, NULL); | ||
620 | |||
621 | if (opt == -1) | ||
622 | break; | ||
623 | |||
624 | switch (opt) { | ||
625 | case '4': | ||
626 | ipv4 = 1; | ||
627 | break; | ||
628 | case '6': | ||
629 | ipv6 = 1; | ||
630 | break; | ||
631 | case 'D': | ||
632 | daemonize = 1; | ||
633 | break; | ||
634 | case 'd': | ||
635 | usbip_use_debug = 1; | ||
636 | break; | ||
637 | case 'h': | ||
638 | cmd = cmd_help; | ||
639 | break; | ||
640 | case 'P': | ||
641 | pid_file = optarg ? optarg : DEFAULT_PID_FILE; | ||
642 | break; | ||
643 | case 't': | ||
644 | usbip_setup_port_number(optarg); | ||
645 | break; | ||
646 | case 'v': | ||
647 | cmd = cmd_version; | ||
648 | break; | ||
649 | case '?': | ||
650 | usbipd_help(); | ||
651 | default: | ||
652 | goto err_out; | ||
653 | } | ||
654 | } | ||
655 | |||
656 | if (!ipv4 && !ipv6) | ||
657 | ipv4 = ipv6 = 1; | ||
658 | |||
659 | switch (cmd) { | ||
660 | case cmd_standalone_mode: | ||
661 | rc = do_standalone_mode(daemonize, ipv4, ipv6); | ||
662 | remove_pid_file(); | ||
663 | break; | ||
664 | case cmd_version: | ||
665 | printf(PROGNAME " (%s)\n", usbip_version_string); | ||
666 | rc = 0; | ||
667 | break; | ||
668 | case cmd_help: | ||
669 | usbipd_help(); | ||
670 | rc = 0; | ||
671 | break; | ||
672 | default: | ||
673 | usbipd_help(); | ||
674 | goto err_out; | ||
675 | } | ||
676 | |||
677 | err_out: | ||
678 | return (rc > -1 ? EXIT_SUCCESS : EXIT_FAILURE); | ||
679 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/utils.c b/drivers/staging/usbip/userspace/src/utils.c deleted file mode 100644 index 2b3d6d235015..000000000000 --- a/drivers/staging/usbip/userspace/src/utils.c +++ /dev/null | |||
@@ -1,52 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #include <errno.h> | ||
20 | #include <stdio.h> | ||
21 | #include <string.h> | ||
22 | |||
23 | #include "usbip_common.h" | ||
24 | #include "utils.h" | ||
25 | #include "sysfs_utils.h" | ||
26 | |||
27 | int modify_match_busid(char *busid, int add) | ||
28 | { | ||
29 | char attr_name[] = "match_busid"; | ||
30 | char command[SYSFS_BUS_ID_SIZE + 4]; | ||
31 | char match_busid_attr_path[SYSFS_PATH_MAX]; | ||
32 | int rc; | ||
33 | |||
34 | snprintf(match_busid_attr_path, sizeof(match_busid_attr_path), | ||
35 | "%s/%s/%s/%s/%s/%s", SYSFS_MNT_PATH, SYSFS_BUS_NAME, | ||
36 | SYSFS_BUS_TYPE, SYSFS_DRIVERS_NAME, USBIP_HOST_DRV_NAME, | ||
37 | attr_name); | ||
38 | |||
39 | if (add) | ||
40 | snprintf(command, SYSFS_BUS_ID_SIZE + 4, "add %s", busid); | ||
41 | else | ||
42 | snprintf(command, SYSFS_BUS_ID_SIZE + 4, "del %s", busid); | ||
43 | |||
44 | rc = write_sysfs_attribute(match_busid_attr_path, command, | ||
45 | sizeof(command)); | ||
46 | if (rc < 0) { | ||
47 | dbg("failed to write match_busid: %s", strerror(errno)); | ||
48 | return -1; | ||
49 | } | ||
50 | |||
51 | return 0; | ||
52 | } | ||
diff --git a/drivers/staging/usbip/userspace/src/utils.h b/drivers/staging/usbip/userspace/src/utils.h deleted file mode 100644 index 5916fd3e02a6..000000000000 --- a/drivers/staging/usbip/userspace/src/utils.h +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 matt mooney <mfm@muteddisk.com> | ||
3 | * 2005-2007 Takahiro Hirofuchi | ||
4 | * | ||
5 | * This program is free software: you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License as published by | ||
7 | * the Free Software Foundation, either version 2 of the License, or | ||
8 | * (at your option) any later version. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | |||
19 | #ifndef __UTILS_H | ||
20 | #define __UTILS_H | ||
21 | |||
22 | int modify_match_busid(char *busid, int add); | ||
23 | |||
24 | #endif /* __UTILS_H */ | ||
25 | |||
diff --git a/drivers/thunderbolt/path.c b/drivers/thunderbolt/path.c index 8fcf8a7b6c22..9562cd026dc0 100644 --- a/drivers/thunderbolt/path.c +++ b/drivers/thunderbolt/path.c | |||
@@ -150,7 +150,26 @@ int tb_path_activate(struct tb_path *path) | |||
150 | 150 | ||
151 | /* Activate hops. */ | 151 | /* Activate hops. */ |
152 | for (i = path->path_length - 1; i >= 0; i--) { | 152 | for (i = path->path_length - 1; i >= 0; i--) { |
153 | struct tb_regs_hop hop; | 153 | struct tb_regs_hop hop = { 0 }; |
154 | |||
155 | /* | ||
156 | * We do (currently) not tear down paths setup by the firmeware. | ||
157 | * If a firmware device is unplugged and plugged in again then | ||
158 | * it can happen that we reuse some of the hops from the (now | ||
159 | * defunct) firmeware path. This causes the hotplug operation to | ||
160 | * fail (the pci device does not show up). Clearing the hop | ||
161 | * before overwriting it fixes the problem. | ||
162 | * | ||
163 | * Should be removed once we discover and tear down firmeware | ||
164 | * paths. | ||
165 | */ | ||
166 | res = tb_port_write(path->hops[i].in_port, &hop, TB_CFG_HOPS, | ||
167 | 2 * path->hops[i].in_hop_index, 2); | ||
168 | if (res) { | ||
169 | __tb_path_deactivate_hops(path, i); | ||
170 | __tb_path_deallocate_nfc(path, 0); | ||
171 | goto err; | ||
172 | } | ||
154 | 173 | ||
155 | /* dword 0 */ | 174 | /* dword 0 */ |
156 | hop.next_hop = path->hops[i].next_hop_index; | 175 | hop.next_hop = path->hops[i].next_hop_index; |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index e0cad4418085..cf1b19bca306 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -92,6 +92,8 @@ source "drivers/usb/storage/Kconfig" | |||
92 | 92 | ||
93 | source "drivers/usb/image/Kconfig" | 93 | source "drivers/usb/image/Kconfig" |
94 | 94 | ||
95 | source "drivers/usb/usbip/Kconfig" | ||
96 | |||
95 | endif | 97 | endif |
96 | 98 | ||
97 | source "drivers/usb/musb/Kconfig" | 99 | source "drivers/usb/musb/Kconfig" |
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 3cba892b83a2..d7be71778059 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -60,3 +60,5 @@ obj-$(CONFIG_USB_RENESAS_USBHS) += renesas_usbhs/ | |||
60 | obj-$(CONFIG_USB_GADGET) += gadget/ | 60 | obj-$(CONFIG_USB_GADGET) += gadget/ |
61 | 61 | ||
62 | obj-$(CONFIG_USB_COMMON) += common/ | 62 | obj-$(CONFIG_USB_COMMON) += common/ |
63 | |||
64 | obj-$(CONFIG_USBIP_CORE) += usbip/ | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8a4dcbc7a75f..46f5161c7891 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1728,8 +1728,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1728 | * - Change autosuspend delay of hub can avoid unnecessary auto | 1728 | * - Change autosuspend delay of hub can avoid unnecessary auto |
1729 | * suspend timer for hub, also may decrease power consumption | 1729 | * suspend timer for hub, also may decrease power consumption |
1730 | * of USB bus. | 1730 | * of USB bus. |
1731 | * | ||
1732 | * - If user has indicated to prevent autosuspend by passing | ||
1733 | * usbcore.autosuspend = -1 then keep autosuspend disabled. | ||
1731 | */ | 1734 | */ |
1732 | pm_runtime_set_autosuspend_delay(&hdev->dev, 0); | 1735 | #ifdef CONFIG_PM_RUNTIME |
1736 | if (hdev->dev.power.autosuspend_delay >= 0) | ||
1737 | pm_runtime_set_autosuspend_delay(&hdev->dev, 0); | ||
1738 | #endif | ||
1733 | 1739 | ||
1734 | /* | 1740 | /* |
1735 | * Hubs have proper suspend/resume support, except for root hubs | 1741 | * Hubs have proper suspend/resume support, except for root hubs |
@@ -2107,8 +2113,8 @@ void usb_disconnect(struct usb_device **pdev) | |||
2107 | { | 2113 | { |
2108 | struct usb_port *port_dev = NULL; | 2114 | struct usb_port *port_dev = NULL; |
2109 | struct usb_device *udev = *pdev; | 2115 | struct usb_device *udev = *pdev; |
2110 | struct usb_hub *hub; | 2116 | struct usb_hub *hub = NULL; |
2111 | int port1; | 2117 | int port1 = 1; |
2112 | 2118 | ||
2113 | /* mark the device as inactive, so any further urb submissions for | 2119 | /* mark the device as inactive, so any further urb submissions for |
2114 | * this device (and any of its children) will fail immediately. | 2120 | * this device (and any of its children) will fail immediately. |
@@ -4631,9 +4637,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, | |||
4631 | if (status != -ENODEV && | 4637 | if (status != -ENODEV && |
4632 | port1 != unreliable_port && | 4638 | port1 != unreliable_port && |
4633 | printk_ratelimit()) | 4639 | printk_ratelimit()) |
4634 | dev_err(&udev->dev, "connect-debounce failed, port %d disabled\n", | 4640 | dev_err(&port_dev->dev, "connect-debounce failed\n"); |
4635 | port1); | ||
4636 | |||
4637 | portstatus &= ~USB_PORT_STAT_CONNECTION; | 4641 | portstatus &= ~USB_PORT_STAT_CONNECTION; |
4638 | unreliable_port = port1; | 4642 | unreliable_port = port1; |
4639 | } else { | 4643 | } else { |
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index 0ba9c335b584..7c9618e916e2 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
@@ -1901,7 +1901,7 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx, | |||
1901 | static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg) | 1901 | static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg) |
1902 | { | 1902 | { |
1903 | u32 dsts = readl(hsotg->regs + DSTS); | 1903 | u32 dsts = readl(hsotg->regs + DSTS); |
1904 | int ep0_mps = 0, ep_mps; | 1904 | int ep0_mps = 0, ep_mps = 8; |
1905 | 1905 | ||
1906 | /* | 1906 | /* |
1907 | * This should signal the finish of the enumeration phase | 1907 | * This should signal the finish of the enumeration phase |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index ef4936ff626c..9dcfbe7cd5f5 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
@@ -425,7 +425,7 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap) | |||
425 | 425 | ||
426 | static int dwc3_omap_extcon_register(struct dwc3_omap *omap) | 426 | static int dwc3_omap_extcon_register(struct dwc3_omap *omap) |
427 | { | 427 | { |
428 | u32 ret; | 428 | int ret; |
429 | struct device_node *node = omap->dev->of_node; | 429 | struct device_node *node = omap->dev->of_node; |
430 | struct extcon_dev *edev; | 430 | struct extcon_dev *edev; |
431 | 431 | ||
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index a186afeaa700..9add915d41f7 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | subdir-ccflags-$(CONFIG_USB_GADGET_DEBUG) := -DDEBUG | 4 | subdir-ccflags-$(CONFIG_USB_GADGET_DEBUG) := -DDEBUG |
5 | subdir-ccflags-$(CONFIG_USB_GADGET_VERBOSE) += -DVERBOSE_DEBUG | 5 | subdir-ccflags-$(CONFIG_USB_GADGET_VERBOSE) += -DVERBOSE_DEBUG |
6 | ccflags-y += -I$(PWD)/drivers/usb/gadget/udc | 6 | ccflags-y += -Idrivers/usb/gadget/udc |
7 | 7 | ||
8 | obj-$(CONFIG_USB_LIBCOMPOSITE) += libcomposite.o | 8 | obj-$(CONFIG_USB_LIBCOMPOSITE) += libcomposite.o |
9 | libcomposite-y := usbstring.o config.o epautoconf.o | 9 | libcomposite-y := usbstring.o config.o epautoconf.o |
diff --git a/drivers/usb/gadget/function/Makefile b/drivers/usb/gadget/function/Makefile index 6d91f21b52a6..83ae1065149d 100644 --- a/drivers/usb/gadget/function/Makefile +++ b/drivers/usb/gadget/function/Makefile | |||
@@ -2,8 +2,8 @@ | |||
2 | # USB peripheral controller drivers | 2 | # USB peripheral controller drivers |
3 | # | 3 | # |
4 | 4 | ||
5 | ccflags-y := -I$(PWD)/drivers/usb/gadget/ | 5 | ccflags-y := -Idrivers/usb/gadget/ |
6 | ccflags-y += -I$(PWD)/drivers/usb/gadget/udc/ | 6 | ccflags-y += -Idrivers/usb/gadget/udc/ |
7 | 7 | ||
8 | # USB Functions | 8 | # USB Functions |
9 | usb_f_acm-y := f_acm.o | 9 | usb_f_acm-y := f_acm.o |
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index d50adda913cf..6e6f87656e7b 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c | |||
@@ -1127,10 +1127,7 @@ void gether_disconnect(struct gether *link) | |||
1127 | 1127 | ||
1128 | DBG(dev, "%s\n", __func__); | 1128 | DBG(dev, "%s\n", __func__); |
1129 | 1129 | ||
1130 | netif_tx_lock(dev->net); | ||
1131 | netif_stop_queue(dev->net); | 1130 | netif_stop_queue(dev->net); |
1132 | netif_tx_unlock(dev->net); | ||
1133 | |||
1134 | netif_carrier_off(dev->net); | 1131 | netif_carrier_off(dev->net); |
1135 | 1132 | ||
1136 | /* disable endpoints, forcing (synchronous) completion | 1133 | /* disable endpoints, forcing (synchronous) completion |
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c index 71e896d4c5ae..a5eb9a3fbb7a 100644 --- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c | |||
@@ -195,6 +195,7 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req) | |||
195 | printk(KERN_INFO "Failed to queue request (%d).\n", ret); | 195 | printk(KERN_INFO "Failed to queue request (%d).\n", ret); |
196 | usb_ep_set_halt(ep); | 196 | usb_ep_set_halt(ep); |
197 | spin_unlock_irqrestore(&video->queue.irqlock, flags); | 197 | spin_unlock_irqrestore(&video->queue.irqlock, flags); |
198 | uvc_queue_cancel(queue, 0); | ||
198 | goto requeue; | 199 | goto requeue; |
199 | } | 200 | } |
200 | spin_unlock_irqrestore(&video->queue.irqlock, flags); | 201 | spin_unlock_irqrestore(&video->queue.irqlock, flags); |
@@ -281,6 +282,7 @@ error: | |||
281 | static int | 282 | static int |
282 | uvc_video_pump(struct uvc_video *video) | 283 | uvc_video_pump(struct uvc_video *video) |
283 | { | 284 | { |
285 | struct uvc_video_queue *queue = &video->queue; | ||
284 | struct usb_request *req; | 286 | struct usb_request *req; |
285 | struct uvc_buffer *buf; | 287 | struct uvc_buffer *buf; |
286 | unsigned long flags; | 288 | unsigned long flags; |
@@ -322,6 +324,7 @@ uvc_video_pump(struct uvc_video *video) | |||
322 | printk(KERN_INFO "Failed to queue request (%d)\n", ret); | 324 | printk(KERN_INFO "Failed to queue request (%d)\n", ret); |
323 | usb_ep_set_halt(video->ep); | 325 | usb_ep_set_halt(video->ep); |
324 | spin_unlock_irqrestore(&video->queue.irqlock, flags); | 326 | spin_unlock_irqrestore(&video->queue.irqlock, flags); |
327 | uvc_queue_cancel(queue, 0); | ||
325 | break; | 328 | break; |
326 | } | 329 | } |
327 | spin_unlock_irqrestore(&video->queue.irqlock, flags); | 330 | spin_unlock_irqrestore(&video->queue.irqlock, flags); |
diff --git a/drivers/usb/gadget/legacy/Makefile b/drivers/usb/gadget/legacy/Makefile index a11aad5635df..edba2d1ee0f3 100644 --- a/drivers/usb/gadget/legacy/Makefile +++ b/drivers/usb/gadget/legacy/Makefile | |||
@@ -2,9 +2,9 @@ | |||
2 | # USB gadget drivers | 2 | # USB gadget drivers |
3 | # | 3 | # |
4 | 4 | ||
5 | ccflags-y := -I$(PWD)/drivers/usb/gadget/ | 5 | ccflags-y := -Idrivers/usb/gadget/ |
6 | ccflags-y += -I$(PWD)/drivers/usb/gadget/udc/ | 6 | ccflags-y += -Idrivers/usb/gadget/udc/ |
7 | ccflags-y += -I$(PWD)/drivers/usb/gadget/function/ | 7 | ccflags-y += -Idrivers/usb/gadget/function/ |
8 | 8 | ||
9 | g_zero-y := zero.o | 9 | g_zero-y := zero.o |
10 | g_audio-y := audio.o | 10 | g_audio-y := audio.o |
diff --git a/drivers/usb/gadget/legacy/dbgp.c b/drivers/usb/gadget/legacy/dbgp.c index 986fc511a2ed..225e385a6160 100644 --- a/drivers/usb/gadget/legacy/dbgp.c +++ b/drivers/usb/gadget/legacy/dbgp.c | |||
@@ -222,10 +222,12 @@ static void dbgp_unbind(struct usb_gadget *gadget) | |||
222 | { | 222 | { |
223 | #ifdef CONFIG_USB_G_DBGP_SERIAL | 223 | #ifdef CONFIG_USB_G_DBGP_SERIAL |
224 | kfree(dbgp.serial); | 224 | kfree(dbgp.serial); |
225 | dbgp.serial = NULL; | ||
225 | #endif | 226 | #endif |
226 | if (dbgp.req) { | 227 | if (dbgp.req) { |
227 | kfree(dbgp.req->buf); | 228 | kfree(dbgp.req->buf); |
228 | usb_ep_free_request(gadget->ep0, dbgp.req); | 229 | usb_ep_free_request(gadget->ep0, dbgp.req); |
230 | dbgp.req = NULL; | ||
229 | } | 231 | } |
230 | 232 | ||
231 | gadget->ep0->driver_data = NULL; | 233 | gadget->ep0->driver_data = NULL; |
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index 2e4ce7704908..e96077b8bf79 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
@@ -440,7 +440,7 @@ ep_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
440 | 440 | ||
441 | value = -ENOMEM; | 441 | value = -ENOMEM; |
442 | kbuf = memdup_user(buf, len); | 442 | kbuf = memdup_user(buf, len); |
443 | if (!kbuf) { | 443 | if (IS_ERR(kbuf)) { |
444 | value = PTR_ERR(kbuf); | 444 | value = PTR_ERR(kbuf); |
445 | goto free1; | 445 | goto free1; |
446 | } | 446 | } |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 5151f947a4f5..34ebaa68504c 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
@@ -332,7 +332,7 @@ config USB_GOKU | |||
332 | gadget drivers to also be dynamically linked. | 332 | gadget drivers to also be dynamically linked. |
333 | 333 | ||
334 | config USB_EG20T | 334 | config USB_EG20T |
335 | tristate "Intel EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC" | 335 | tristate "Intel QUARK X1000/EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC" |
336 | depends on PCI | 336 | depends on PCI |
337 | help | 337 | help |
338 | This is a USB device driver for EG20T PCH. | 338 | This is a USB device driver for EG20T PCH. |
@@ -353,6 +353,7 @@ config USB_EG20T | |||
353 | ML7213/ML7831 is companion chip for Intel Atom E6xx series. | 353 | ML7213/ML7831 is companion chip for Intel Atom E6xx series. |
354 | ML7213/ML7831 is completely compatible for Intel EG20T PCH. | 354 | ML7213/ML7831 is completely compatible for Intel EG20T PCH. |
355 | 355 | ||
356 | This driver can be used with Intel's Quark X1000 SOC platform | ||
356 | # | 357 | # |
357 | # LAST -- dummy/emulated controller | 358 | # LAST -- dummy/emulated controller |
358 | # | 359 | # |
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 906e65f0e4fa..c9fe67e29d35 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
@@ -1661,7 +1661,7 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1661 | if (dma_status) { | 1661 | if (dma_status) { |
1662 | int i; | 1662 | int i; |
1663 | 1663 | ||
1664 | for (i = 1; i < USBA_NR_DMAS; i++) | 1664 | for (i = 1; i <= USBA_NR_DMAS; i++) |
1665 | if (dma_status & (1 << i)) | 1665 | if (dma_status & (1 << i)) |
1666 | usba_dma_irq(udc, &udc->usba_ep[i]); | 1666 | usba_dma_irq(udc, &udc->usba_ep[i]); |
1667 | } | 1667 | } |
diff --git a/drivers/usb/gadget/udc/fusb300_udc.c b/drivers/usb/gadget/udc/fusb300_udc.c index d40255f784df..5c5d1adda7eb 100644 --- a/drivers/usb/gadget/udc/fusb300_udc.c +++ b/drivers/usb/gadget/udc/fusb300_udc.c | |||
@@ -1398,13 +1398,17 @@ static int fusb300_probe(struct platform_device *pdev) | |||
1398 | 1398 | ||
1399 | /* initialize udc */ | 1399 | /* initialize udc */ |
1400 | fusb300 = kzalloc(sizeof(struct fusb300), GFP_KERNEL); | 1400 | fusb300 = kzalloc(sizeof(struct fusb300), GFP_KERNEL); |
1401 | if (fusb300 == NULL) | 1401 | if (fusb300 == NULL) { |
1402 | ret = -ENOMEM; | ||
1402 | goto clean_up; | 1403 | goto clean_up; |
1404 | } | ||
1403 | 1405 | ||
1404 | for (i = 0; i < FUSB300_MAX_NUM_EP; i++) { | 1406 | for (i = 0; i < FUSB300_MAX_NUM_EP; i++) { |
1405 | _ep[i] = kzalloc(sizeof(struct fusb300_ep), GFP_KERNEL); | 1407 | _ep[i] = kzalloc(sizeof(struct fusb300_ep), GFP_KERNEL); |
1406 | if (_ep[i] == NULL) | 1408 | if (_ep[i] == NULL) { |
1409 | ret = -ENOMEM; | ||
1407 | goto clean_up; | 1410 | goto clean_up; |
1411 | } | ||
1408 | fusb300->ep[i] = _ep[i]; | 1412 | fusb300->ep[i] = _ep[i]; |
1409 | } | 1413 | } |
1410 | 1414 | ||
diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c index eb8c3bedb57a..460d953c91b6 100644 --- a/drivers/usb/gadget/udc/pch_udc.c +++ b/drivers/usb/gadget/udc/pch_udc.c | |||
@@ -343,6 +343,7 @@ struct pch_vbus_gpio_data { | |||
343 | * @setup_data: Received setup data | 343 | * @setup_data: Received setup data |
344 | * @phys_addr: of device memory | 344 | * @phys_addr: of device memory |
345 | * @base_addr: for mapped device memory | 345 | * @base_addr: for mapped device memory |
346 | * @bar: Indicates which PCI BAR for USB regs | ||
346 | * @irq: IRQ line for the device | 347 | * @irq: IRQ line for the device |
347 | * @cfg_data: current cfg, intf, and alt in use | 348 | * @cfg_data: current cfg, intf, and alt in use |
348 | * @vbus_gpio: GPIO informaton for detecting VBUS | 349 | * @vbus_gpio: GPIO informaton for detecting VBUS |
@@ -370,14 +371,17 @@ struct pch_udc_dev { | |||
370 | struct usb_ctrlrequest setup_data; | 371 | struct usb_ctrlrequest setup_data; |
371 | unsigned long phys_addr; | 372 | unsigned long phys_addr; |
372 | void __iomem *base_addr; | 373 | void __iomem *base_addr; |
374 | unsigned bar; | ||
373 | unsigned irq; | 375 | unsigned irq; |
374 | struct pch_udc_cfg_data cfg_data; | 376 | struct pch_udc_cfg_data cfg_data; |
375 | struct pch_vbus_gpio_data vbus_gpio; | 377 | struct pch_vbus_gpio_data vbus_gpio; |
376 | }; | 378 | }; |
377 | #define to_pch_udc(g) (container_of((g), struct pch_udc_dev, gadget)) | 379 | #define to_pch_udc(g) (container_of((g), struct pch_udc_dev, gadget)) |
378 | 380 | ||
381 | #define PCH_UDC_PCI_BAR_QUARK_X1000 0 | ||
379 | #define PCH_UDC_PCI_BAR 1 | 382 | #define PCH_UDC_PCI_BAR 1 |
380 | #define PCI_DEVICE_ID_INTEL_EG20T_UDC 0x8808 | 383 | #define PCI_DEVICE_ID_INTEL_EG20T_UDC 0x8808 |
384 | #define PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC 0x0939 | ||
381 | #define PCI_VENDOR_ID_ROHM 0x10DB | 385 | #define PCI_VENDOR_ID_ROHM 0x10DB |
382 | #define PCI_DEVICE_ID_ML7213_IOH_UDC 0x801D | 386 | #define PCI_DEVICE_ID_ML7213_IOH_UDC 0x801D |
383 | #define PCI_DEVICE_ID_ML7831_IOH_UDC 0x8808 | 387 | #define PCI_DEVICE_ID_ML7831_IOH_UDC 0x8808 |
@@ -3076,7 +3080,7 @@ static void pch_udc_remove(struct pci_dev *pdev) | |||
3076 | iounmap(dev->base_addr); | 3080 | iounmap(dev->base_addr); |
3077 | if (dev->mem_region) | 3081 | if (dev->mem_region) |
3078 | release_mem_region(dev->phys_addr, | 3082 | release_mem_region(dev->phys_addr, |
3079 | pci_resource_len(pdev, PCH_UDC_PCI_BAR)); | 3083 | pci_resource_len(pdev, dev->bar)); |
3080 | if (dev->active) | 3084 | if (dev->active) |
3081 | pci_disable_device(pdev); | 3085 | pci_disable_device(pdev); |
3082 | kfree(dev); | 3086 | kfree(dev); |
@@ -3144,9 +3148,15 @@ static int pch_udc_probe(struct pci_dev *pdev, | |||
3144 | dev->active = 1; | 3148 | dev->active = 1; |
3145 | pci_set_drvdata(pdev, dev); | 3149 | pci_set_drvdata(pdev, dev); |
3146 | 3150 | ||
3151 | /* Determine BAR based on PCI ID */ | ||
3152 | if (id->device == PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC) | ||
3153 | dev->bar = PCH_UDC_PCI_BAR_QUARK_X1000; | ||
3154 | else | ||
3155 | dev->bar = PCH_UDC_PCI_BAR; | ||
3156 | |||
3147 | /* PCI resource allocation */ | 3157 | /* PCI resource allocation */ |
3148 | resource = pci_resource_start(pdev, 1); | 3158 | resource = pci_resource_start(pdev, dev->bar); |
3149 | len = pci_resource_len(pdev, 1); | 3159 | len = pci_resource_len(pdev, dev->bar); |
3150 | 3160 | ||
3151 | if (!request_mem_region(resource, len, KBUILD_MODNAME)) { | 3161 | if (!request_mem_region(resource, len, KBUILD_MODNAME)) { |
3152 | dev_err(&pdev->dev, "%s: pci device used already\n", __func__); | 3162 | dev_err(&pdev->dev, "%s: pci device used already\n", __func__); |
@@ -3212,6 +3222,12 @@ finished: | |||
3212 | 3222 | ||
3213 | static const struct pci_device_id pch_udc_pcidev_id[] = { | 3223 | static const struct pci_device_id pch_udc_pcidev_id[] = { |
3214 | { | 3224 | { |
3225 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, | ||
3226 | PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC), | ||
3227 | .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, | ||
3228 | .class_mask = 0xffffffff, | ||
3229 | }, | ||
3230 | { | ||
3215 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC), | 3231 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC), |
3216 | .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, | 3232 | .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, |
3217 | .class_mask = 0xffffffff, | 3233 | .class_mask = 0xffffffff, |
diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c b/drivers/usb/gadget/udc/r8a66597-udc.c index 46008421c1ec..de2a8713b428 100644 --- a/drivers/usb/gadget/udc/r8a66597-udc.c +++ b/drivers/usb/gadget/udc/r8a66597-udc.c | |||
@@ -1868,8 +1868,8 @@ static int r8a66597_probe(struct platform_device *pdev) | |||
1868 | 1868 | ||
1869 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1869 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1870 | reg = devm_ioremap_resource(&pdev->dev, res); | 1870 | reg = devm_ioremap_resource(&pdev->dev, res); |
1871 | if (!reg) | 1871 | if (IS_ERR(reg)) |
1872 | return -ENODEV; | 1872 | return PTR_ERR(reg); |
1873 | 1873 | ||
1874 | ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1874 | ires = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1875 | irq = ires->start; | 1875 | irq = ires->start; |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index cc305c71ac3d..6130b7574908 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -1230,7 +1230,7 @@ int ehci_hub_control( | |||
1230 | if (selector == EHSET_TEST_SINGLE_STEP_SET_FEATURE) { | 1230 | if (selector == EHSET_TEST_SINGLE_STEP_SET_FEATURE) { |
1231 | spin_unlock_irqrestore(&ehci->lock, flags); | 1231 | spin_unlock_irqrestore(&ehci->lock, flags); |
1232 | retval = ehset_single_step_set_feature(hcd, | 1232 | retval = ehset_single_step_set_feature(hcd, |
1233 | wIndex); | 1233 | wIndex + 1); |
1234 | spin_lock_irqsave(&ehci->lock, flags); | 1234 | spin_lock_irqsave(&ehci->lock, flags); |
1235 | break; | 1235 | break; |
1236 | } | 1236 | } |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 687d36608155..c22a3e15a16e 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -101,6 +101,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
101 | /* AMD PLL quirk */ | 101 | /* AMD PLL quirk */ |
102 | if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) | 102 | if (pdev->vendor == PCI_VENDOR_ID_AMD && usb_amd_find_chipset_info()) |
103 | xhci->quirks |= XHCI_AMD_PLL_FIX; | 103 | xhci->quirks |= XHCI_AMD_PLL_FIX; |
104 | |||
105 | if (pdev->vendor == PCI_VENDOR_ID_AMD) | ||
106 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | ||
107 | |||
104 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { | 108 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { |
105 | xhci->quirks |= XHCI_LPM_SUPPORT; | 109 | xhci->quirks |= XHCI_LPM_SUPPORT; |
106 | xhci->quirks |= XHCI_INTEL_HOST; | 110 | xhci->quirks |= XHCI_INTEL_HOST; |
@@ -151,6 +155,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
151 | if (pdev->vendor == PCI_VENDOR_ID_VIA) | 155 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
152 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 156 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
153 | 157 | ||
158 | /* See https://bugzilla.kernel.org/show_bug.cgi?id=79511 */ | ||
159 | if (pdev->vendor == PCI_VENDOR_ID_VIA && | ||
160 | pdev->device == 0x3432) | ||
161 | xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
162 | |||
154 | if (xhci->quirks & XHCI_RESET_ON_RESUME) | 163 | if (xhci->quirks & XHCI_RESET_ON_RESUME) |
155 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, | 164 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, |
156 | "QUIRK: Resetting on resume"); | 165 | "QUIRK: Resetting on resume"); |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 60fb52ae864b..abed30b82905 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -364,32 +364,6 @@ static void ring_doorbell_for_active_rings(struct xhci_hcd *xhci, | |||
364 | } | 364 | } |
365 | } | 365 | } |
366 | 366 | ||
367 | /* | ||
368 | * Find the segment that trb is in. Start searching in start_seg. | ||
369 | * If we must move past a segment that has a link TRB with a toggle cycle state | ||
370 | * bit set, then we will toggle the value pointed at by cycle_state. | ||
371 | */ | ||
372 | static struct xhci_segment *find_trb_seg( | ||
373 | struct xhci_segment *start_seg, | ||
374 | union xhci_trb *trb, int *cycle_state) | ||
375 | { | ||
376 | struct xhci_segment *cur_seg = start_seg; | ||
377 | struct xhci_generic_trb *generic_trb; | ||
378 | |||
379 | while (cur_seg->trbs > trb || | ||
380 | &cur_seg->trbs[TRBS_PER_SEGMENT - 1] < trb) { | ||
381 | generic_trb = &cur_seg->trbs[TRBS_PER_SEGMENT - 1].generic; | ||
382 | if (generic_trb->field[3] & cpu_to_le32(LINK_TOGGLE)) | ||
383 | *cycle_state ^= 0x1; | ||
384 | cur_seg = cur_seg->next; | ||
385 | if (cur_seg == start_seg) | ||
386 | /* Looped over the entire list. Oops! */ | ||
387 | return NULL; | ||
388 | } | ||
389 | return cur_seg; | ||
390 | } | ||
391 | |||
392 | |||
393 | static struct xhci_ring *xhci_triad_to_transfer_ring(struct xhci_hcd *xhci, | 367 | static struct xhci_ring *xhci_triad_to_transfer_ring(struct xhci_hcd *xhci, |
394 | unsigned int slot_id, unsigned int ep_index, | 368 | unsigned int slot_id, unsigned int ep_index, |
395 | unsigned int stream_id) | 369 | unsigned int stream_id) |
@@ -459,9 +433,12 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
459 | struct xhci_virt_device *dev = xhci->devs[slot_id]; | 433 | struct xhci_virt_device *dev = xhci->devs[slot_id]; |
460 | struct xhci_virt_ep *ep = &dev->eps[ep_index]; | 434 | struct xhci_virt_ep *ep = &dev->eps[ep_index]; |
461 | struct xhci_ring *ep_ring; | 435 | struct xhci_ring *ep_ring; |
462 | struct xhci_generic_trb *trb; | 436 | struct xhci_segment *new_seg; |
437 | union xhci_trb *new_deq; | ||
463 | dma_addr_t addr; | 438 | dma_addr_t addr; |
464 | u64 hw_dequeue; | 439 | u64 hw_dequeue; |
440 | bool cycle_found = false; | ||
441 | bool td_last_trb_found = false; | ||
465 | 442 | ||
466 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, | 443 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, |
467 | ep_index, stream_id); | 444 | ep_index, stream_id); |
@@ -486,45 +463,45 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
486 | hw_dequeue = le64_to_cpu(ep_ctx->deq); | 463 | hw_dequeue = le64_to_cpu(ep_ctx->deq); |
487 | } | 464 | } |
488 | 465 | ||
489 | /* Find virtual address and segment of hardware dequeue pointer */ | 466 | new_seg = ep_ring->deq_seg; |
490 | state->new_deq_seg = ep_ring->deq_seg; | 467 | new_deq = ep_ring->dequeue; |
491 | state->new_deq_ptr = ep_ring->dequeue; | 468 | state->new_cycle_state = hw_dequeue & 0x1; |
492 | while (xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr) | 469 | |
493 | != (dma_addr_t)(hw_dequeue & ~0xf)) { | ||
494 | next_trb(xhci, ep_ring, &state->new_deq_seg, | ||
495 | &state->new_deq_ptr); | ||
496 | if (state->new_deq_ptr == ep_ring->dequeue) { | ||
497 | WARN_ON(1); | ||
498 | return; | ||
499 | } | ||
500 | } | ||
501 | /* | 470 | /* |
502 | * Find cycle state for last_trb, starting at old cycle state of | 471 | * We want to find the pointer, segment and cycle state of the new trb |
503 | * hw_dequeue. If there is only one segment ring, find_trb_seg() will | 472 | * (the one after current TD's last_trb). We know the cycle state at |
504 | * return immediately and cannot toggle the cycle state if this search | 473 | * hw_dequeue, so walk the ring until both hw_dequeue and last_trb are |
505 | * wraps around, so add one more toggle manually in that case. | 474 | * found. |
506 | */ | 475 | */ |
507 | state->new_cycle_state = hw_dequeue & 0x1; | 476 | do { |
508 | if (ep_ring->first_seg == ep_ring->first_seg->next && | 477 | if (!cycle_found && xhci_trb_virt_to_dma(new_seg, new_deq) |
509 | cur_td->last_trb < state->new_deq_ptr) | 478 | == (dma_addr_t)(hw_dequeue & ~0xf)) { |
510 | state->new_cycle_state ^= 0x1; | 479 | cycle_found = true; |
480 | if (td_last_trb_found) | ||
481 | break; | ||
482 | } | ||
483 | if (new_deq == cur_td->last_trb) | ||
484 | td_last_trb_found = true; | ||
511 | 485 | ||
512 | state->new_deq_ptr = cur_td->last_trb; | 486 | if (cycle_found && |
513 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 487 | TRB_TYPE_LINK_LE32(new_deq->generic.field[3]) && |
514 | "Finding segment containing last TRB in TD."); | 488 | new_deq->generic.field[3] & cpu_to_le32(LINK_TOGGLE)) |
515 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, | 489 | state->new_cycle_state ^= 0x1; |
516 | state->new_deq_ptr, &state->new_cycle_state); | 490 | |
517 | if (!state->new_deq_seg) { | 491 | next_trb(xhci, ep_ring, &new_seg, &new_deq); |
518 | WARN_ON(1); | 492 | |
519 | return; | 493 | /* Search wrapped around, bail out */ |
520 | } | 494 | if (new_deq == ep->ring->dequeue) { |
495 | xhci_err(xhci, "Error: Failed finding new dequeue state\n"); | ||
496 | state->new_deq_seg = NULL; | ||
497 | state->new_deq_ptr = NULL; | ||
498 | return; | ||
499 | } | ||
500 | |||
501 | } while (!cycle_found || !td_last_trb_found); | ||
521 | 502 | ||
522 | /* Increment to find next TRB after last_trb. Cycle if appropriate. */ | 503 | state->new_deq_seg = new_seg; |
523 | trb = &state->new_deq_ptr->generic; | 504 | state->new_deq_ptr = new_deq; |
524 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && | ||
525 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) | ||
526 | state->new_cycle_state ^= 0x1; | ||
527 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); | ||
528 | 505 | ||
529 | /* Don't update the ring cycle state for the producer (us). */ | 506 | /* Don't update the ring cycle state for the producer (us). */ |
530 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 507 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
@@ -2487,7 +2464,8 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
2487 | * last TRB of the previous TD. The command completion handle | 2464 | * last TRB of the previous TD. The command completion handle |
2488 | * will take care the rest. | 2465 | * will take care the rest. |
2489 | */ | 2466 | */ |
2490 | if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { | 2467 | if (!event_seg && (trb_comp_code == COMP_STOP || |
2468 | trb_comp_code == COMP_STOP_INVAL)) { | ||
2491 | ret = 0; | 2469 | ret = 0; |
2492 | goto cleanup; | 2470 | goto cleanup; |
2493 | } | 2471 | } |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index b6f21175b872..c020b094fe7d 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -2880,6 +2880,9 @@ void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci, | |||
2880 | ep_index, ep->stopped_stream, ep->stopped_td, | 2880 | ep_index, ep->stopped_stream, ep->stopped_td, |
2881 | &deq_state); | 2881 | &deq_state); |
2882 | 2882 | ||
2883 | if (!deq_state.new_deq_ptr || !deq_state.new_deq_seg) | ||
2884 | return; | ||
2885 | |||
2883 | /* HW with the reset endpoint quirk will use the saved dequeue state to | 2886 | /* HW with the reset endpoint quirk will use the saved dequeue state to |
2884 | * issue a configure endpoint command later. | 2887 | * issue a configure endpoint command later. |
2885 | */ | 2888 | */ |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 06b5d77cd9ad..633caf643122 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -3250,6 +3250,7 @@ static const struct usb_device_id sisusb_table[] = { | |||
3250 | { USB_DEVICE(0x0711, 0x0918) }, | 3250 | { USB_DEVICE(0x0711, 0x0918) }, |
3251 | { USB_DEVICE(0x0711, 0x0920) }, | 3251 | { USB_DEVICE(0x0711, 0x0920) }, |
3252 | { USB_DEVICE(0x0711, 0x0950) }, | 3252 | { USB_DEVICE(0x0711, 0x0950) }, |
3253 | { USB_DEVICE(0x0711, 0x5200) }, | ||
3253 | { USB_DEVICE(0x182d, 0x021c) }, | 3254 | { USB_DEVICE(0x182d, 0x021c) }, |
3254 | { USB_DEVICE(0x182d, 0x0269) }, | 3255 | { USB_DEVICE(0x182d, 0x0269) }, |
3255 | { } | 3256 | { } |
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index 9aad00f11bd5..221faed9f074 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c | |||
@@ -96,7 +96,7 @@ static bool ux500_configure_channel(struct dma_channel *channel, | |||
96 | struct musb *musb = ux500_channel->controller->private_data; | 96 | struct musb *musb = ux500_channel->controller->private_data; |
97 | 97 | ||
98 | dev_dbg(musb->controller, | 98 | dev_dbg(musb->controller, |
99 | "packet_sz=%d, mode=%d, dma_addr=0x%llu, len=%d is_tx=%d\n", | 99 | "packet_sz=%d, mode=%d, dma_addr=0x%llx, len=%d is_tx=%d\n", |
100 | packet_sz, mode, (unsigned long long) dma_addr, | 100 | packet_sz, mode, (unsigned long long) dma_addr, |
101 | len, ux500_channel->is_tx); | 101 | len, ux500_channel->is_tx); |
102 | 102 | ||
diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c index ea9e705555df..f4b14bd97e14 100644 --- a/drivers/usb/phy/phy-gpio-vbus-usb.c +++ b/drivers/usb/phy/phy-gpio-vbus-usb.c | |||
@@ -260,10 +260,8 @@ static int gpio_vbus_probe(struct platform_device *pdev) | |||
260 | 260 | ||
261 | gpio_vbus->phy.otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), | 261 | gpio_vbus->phy.otg = devm_kzalloc(&pdev->dev, sizeof(struct usb_otg), |
262 | GFP_KERNEL); | 262 | GFP_KERNEL); |
263 | if (!gpio_vbus->phy.otg) { | 263 | if (!gpio_vbus->phy.otg) |
264 | kfree(gpio_vbus); | ||
265 | return -ENOMEM; | 264 | return -ENOMEM; |
266 | } | ||
267 | 265 | ||
268 | platform_set_drvdata(pdev, gpio_vbus); | 266 | platform_set_drvdata(pdev, gpio_vbus); |
269 | gpio_vbus->dev = &pdev->dev; | 267 | gpio_vbus->dev = &pdev->dev; |
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index e4108eec5ef4..afc09087ec36 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c | |||
@@ -1601,8 +1601,8 @@ static int msm_otg_probe(struct platform_device *pdev) | |||
1601 | */ | 1601 | */ |
1602 | if (motg->phy_number) { | 1602 | if (motg->phy_number) { |
1603 | phy_select = devm_ioremap_nocache(&pdev->dev, USB2_PHY_SEL, 4); | 1603 | phy_select = devm_ioremap_nocache(&pdev->dev, USB2_PHY_SEL, 4); |
1604 | if (IS_ERR(phy_select)) | 1604 | if (!phy_select) |
1605 | return PTR_ERR(phy_select); | 1605 | return -ENOMEM; |
1606 | /* Enable second PHY with the OTG port */ | 1606 | /* Enable second PHY with the OTG port */ |
1607 | writel(0x1, phy_select); | 1607 | writel(0x1, phy_select); |
1608 | } | 1608 | } |
diff --git a/drivers/usb/phy/phy-samsung-usb.h b/drivers/usb/phy/phy-samsung-usb.h index 68771bfd1825..80eedd45a20a 100644 --- a/drivers/usb/phy/phy-samsung-usb.h +++ b/drivers/usb/phy/phy-samsung-usb.h | |||
@@ -216,7 +216,7 @@ | |||
216 | 216 | ||
217 | #define EXYNOS5_DRD_PHYPARAM1 (0x20) | 217 | #define EXYNOS5_DRD_PHYPARAM1 (0x20) |
218 | 218 | ||
219 | #define PHYPARAM1_PCS_TXDEEMPH_MASK (0x1f << 0) | 219 | #define PHYPARAM1_PCS_TXDEEMPH_MASK (0x3f << 0) |
220 | #define PHYPARAM1_PCS_TXDEEMPH (0x1c) | 220 | #define PHYPARAM1_PCS_TXDEEMPH (0x1c) |
221 | 221 | ||
222 | #define EXYNOS5_DRD_PHYTERM (0x24) | 222 | #define EXYNOS5_DRD_PHYTERM (0x24) |
diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index 6d0f6080eceb..045cd309367a 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c | |||
@@ -232,6 +232,9 @@ struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index) | |||
232 | phy = __usb_find_phy_dev(dev, &phy_bind_list, index); | 232 | phy = __usb_find_phy_dev(dev, &phy_bind_list, index); |
233 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { | 233 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { |
234 | dev_dbg(dev, "unable to find transceiver\n"); | 234 | dev_dbg(dev, "unable to find transceiver\n"); |
235 | if (!IS_ERR(phy)) | ||
236 | phy = ERR_PTR(-ENODEV); | ||
237 | |||
235 | goto err0; | 238 | goto err0; |
236 | } | 239 | } |
237 | 240 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 216ce3078270..824ea5e7ec8b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -146,6 +146,7 @@ static const struct usb_device_id id_table_combined[] = { | |||
146 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, | 146 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, |
147 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, | 147 | { USB_DEVICE(FTDI_VID, FTDI_CANUSB_PID) }, |
148 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, | 148 | { USB_DEVICE(FTDI_VID, FTDI_CANDAPTER_PID) }, |
149 | { USB_DEVICE(FTDI_VID, FTDI_BM_ATOM_NANO_PID) }, | ||
149 | { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, | 150 | { USB_DEVICE(FTDI_VID, FTDI_NXTCAM_PID) }, |
150 | { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) }, | 151 | { USB_DEVICE(FTDI_VID, FTDI_EV3CON_PID) }, |
151 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, | 152 | { USB_DEVICE(FTDI_VID, FTDI_SCS_DEVICE_0_PID) }, |
@@ -934,6 +935,8 @@ static const struct usb_device_id id_table_combined[] = { | |||
934 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, | 935 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, |
935 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, | 936 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, |
936 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, | 937 | { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, |
938 | /* ekey Devices */ | ||
939 | { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) }, | ||
937 | /* Infineon Devices */ | 940 | /* Infineon Devices */ |
938 | { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) }, | 941 | { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) }, |
939 | { } /* Terminating entry */ | 942 | { } /* Terminating entry */ |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 1e58d90a0b6c..70b0b1d88ae9 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -42,6 +42,8 @@ | |||
42 | /* www.candapter.com Ewert Energy Systems CANdapter device */ | 42 | /* www.candapter.com Ewert Energy Systems CANdapter device */ |
43 | #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ | 43 | #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ |
44 | 44 | ||
45 | #define FTDI_BM_ATOM_NANO_PID 0xa559 /* Basic Micro ATOM Nano USB2Serial */ | ||
46 | |||
45 | /* | 47 | /* |
46 | * Texas Instruments XDS100v2 JTAG / BeagleBone A3 | 48 | * Texas Instruments XDS100v2 JTAG / BeagleBone A3 |
47 | * http://processors.wiki.ti.com/index.php/XDS100 | 49 | * http://processors.wiki.ti.com/index.php/XDS100 |
@@ -1378,3 +1380,8 @@ | |||
1378 | #define BRAINBOXES_US_160_6_PID 0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */ | 1380 | #define BRAINBOXES_US_160_6_PID 0x9006 /* US-160 16xRS232 1Mbaud Port 11 and 12 */ |
1379 | #define BRAINBOXES_US_160_7_PID 0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */ | 1381 | #define BRAINBOXES_US_160_7_PID 0x9007 /* US-160 16xRS232 1Mbaud Port 13 and 14 */ |
1380 | #define BRAINBOXES_US_160_8_PID 0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */ | 1382 | #define BRAINBOXES_US_160_8_PID 0x9008 /* US-160 16xRS232 1Mbaud Port 15 and 16 */ |
1383 | |||
1384 | /* | ||
1385 | * ekey biometric systems GmbH (http://ekey.net/) | ||
1386 | */ | ||
1387 | #define FTDI_EKEY_CONV_USB_PID 0xCB08 /* Converter USB */ | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index a9688940543d..54a8120897a6 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -275,8 +275,12 @@ static void option_instat_callback(struct urb *urb); | |||
275 | #define ZTE_PRODUCT_MF622 0x0001 | 275 | #define ZTE_PRODUCT_MF622 0x0001 |
276 | #define ZTE_PRODUCT_MF628 0x0015 | 276 | #define ZTE_PRODUCT_MF628 0x0015 |
277 | #define ZTE_PRODUCT_MF626 0x0031 | 277 | #define ZTE_PRODUCT_MF626 0x0031 |
278 | #define ZTE_PRODUCT_MC2718 0xffe8 | ||
279 | #define ZTE_PRODUCT_AC2726 0xfff1 | 278 | #define ZTE_PRODUCT_AC2726 0xfff1 |
279 | #define ZTE_PRODUCT_CDMA_TECH 0xfffe | ||
280 | #define ZTE_PRODUCT_AC8710T 0xffff | ||
281 | #define ZTE_PRODUCT_MC2718 0xffe8 | ||
282 | #define ZTE_PRODUCT_AD3812 0xffeb | ||
283 | #define ZTE_PRODUCT_MC2716 0xffed | ||
280 | 284 | ||
281 | #define BENQ_VENDOR_ID 0x04a5 | 285 | #define BENQ_VENDOR_ID 0x04a5 |
282 | #define BENQ_PRODUCT_H10 0x4068 | 286 | #define BENQ_PRODUCT_H10 0x4068 |
@@ -494,6 +498,10 @@ static void option_instat_callback(struct urb *urb); | |||
494 | #define INOVIA_VENDOR_ID 0x20a6 | 498 | #define INOVIA_VENDOR_ID 0x20a6 |
495 | #define INOVIA_SEW858 0x1105 | 499 | #define INOVIA_SEW858 0x1105 |
496 | 500 | ||
501 | /* VIA Telecom */ | ||
502 | #define VIATELECOM_VENDOR_ID 0x15eb | ||
503 | #define VIATELECOM_PRODUCT_CDS7 0x0001 | ||
504 | |||
497 | /* some devices interfaces need special handling due to a number of reasons */ | 505 | /* some devices interfaces need special handling due to a number of reasons */ |
498 | enum option_blacklist_reason { | 506 | enum option_blacklist_reason { |
499 | OPTION_BLACKLIST_NONE = 0, | 507 | OPTION_BLACKLIST_NONE = 0, |
@@ -527,10 +535,18 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = { | |||
527 | .reserved = BIT(4), | 535 | .reserved = BIT(4), |
528 | }; | 536 | }; |
529 | 537 | ||
538 | static const struct option_blacklist_info zte_ad3812_z_blacklist = { | ||
539 | .sendsetup = BIT(0) | BIT(1) | BIT(2), | ||
540 | }; | ||
541 | |||
530 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { | 542 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { |
531 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), | 543 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), |
532 | }; | 544 | }; |
533 | 545 | ||
546 | static const struct option_blacklist_info zte_mc2716_z_blacklist = { | ||
547 | .sendsetup = BIT(1) | BIT(2) | BIT(3), | ||
548 | }; | ||
549 | |||
534 | static const struct option_blacklist_info huawei_cdc12_blacklist = { | 550 | static const struct option_blacklist_info huawei_cdc12_blacklist = { |
535 | .reserved = BIT(1) | BIT(2), | 551 | .reserved = BIT(1) | BIT(2), |
536 | }; | 552 | }; |
@@ -1070,6 +1086,7 @@ static const struct usb_device_id option_ids[] = { | |||
1070 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, | 1086 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, |
1071 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, | 1087 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, |
1072 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 1088 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
1089 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | ||
1073 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 1090 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1074 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | 1091 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
1075 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1092 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
@@ -1544,13 +1561,18 @@ static const struct usb_device_id option_ids[] = { | |||
1544 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) }, | 1561 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) }, |
1545 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) }, | 1562 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) }, |
1546 | 1563 | ||
1547 | /* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */ | 1564 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
1565 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
1566 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, | ||
1548 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), | 1567 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), |
1549 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, | 1568 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, |
1569 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff), | ||
1570 | .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, | ||
1571 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), | ||
1572 | .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, | ||
1550 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | 1573 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, |
1551 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | 1574 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, |
1552 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | 1575 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, |
1553 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
1554 | 1576 | ||
1555 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | 1577 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
1556 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | 1578 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
@@ -1724,6 +1746,7 @@ static const struct usb_device_id option_ids[] = { | |||
1724 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ | 1746 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e01, 0xff, 0xff, 0xff) }, /* D-Link DWM-152/C1 */ |
1725 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ | 1747 | { USB_DEVICE_AND_INTERFACE_INFO(0x07d1, 0x3e02, 0xff, 0xff, 0xff) }, /* D-Link DWM-156/C1 */ |
1726 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, | 1748 | { USB_DEVICE(INOVIA_VENDOR_ID, INOVIA_SEW858) }, |
1749 | { USB_DEVICE(VIATELECOM_VENDOR_ID, VIATELECOM_PRODUCT_CDS7) }, | ||
1727 | { } /* Terminating entry */ | 1750 | { } /* Terminating entry */ |
1728 | }; | 1751 | }; |
1729 | MODULE_DEVICE_TABLE(usb, option_ids); | 1752 | MODULE_DEVICE_TABLE(usb, option_ids); |
@@ -1916,6 +1939,8 @@ static void option_instat_callback(struct urb *urb) | |||
1916 | dev_dbg(dev, "%s: type %x req %x\n", __func__, | 1939 | dev_dbg(dev, "%s: type %x req %x\n", __func__, |
1917 | req_pkt->bRequestType, req_pkt->bRequest); | 1940 | req_pkt->bRequestType, req_pkt->bRequest); |
1918 | } | 1941 | } |
1942 | } else if (status == -ENOENT || status == -ESHUTDOWN) { | ||
1943 | dev_dbg(dev, "%s: urb stopped: %d\n", __func__, status); | ||
1919 | } else | 1944 | } else |
1920 | dev_err(dev, "%s: error %d\n", __func__, status); | 1945 | dev_err(dev, "%s: error %d\n", __func__, status); |
1921 | 1946 | ||
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index b3d5a35c0d4b..e9bad928039f 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -45,6 +45,7 @@ static const struct usb_device_id id_table[] = { | |||
45 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, | 45 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_GPRS) }, |
46 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, | 46 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_HCR331) }, |
47 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, | 47 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_MOTOROLA) }, |
48 | { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID_ZTEK) }, | ||
48 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, | 49 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) }, |
49 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, | 50 | { USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) }, |
50 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, | 51 | { USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) }, |
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 42bc082896ac..71fd9da1d6e7 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #define PL2303_PRODUCT_ID_GPRS 0x0609 | 22 | #define PL2303_PRODUCT_ID_GPRS 0x0609 |
23 | #define PL2303_PRODUCT_ID_HCR331 0x331a | 23 | #define PL2303_PRODUCT_ID_HCR331 0x331a |
24 | #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 | 24 | #define PL2303_PRODUCT_ID_MOTOROLA 0x0307 |
25 | #define PL2303_PRODUCT_ID_ZTEK 0xe1f1 | ||
25 | 26 | ||
26 | #define ATEN_VENDOR_ID 0x0557 | 27 | #define ATEN_VENDOR_ID 0x0557 |
27 | #define ATEN_VENDOR_ID2 0x0547 | 28 | #define ATEN_VENDOR_ID2 0x0547 |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 02de3110fe94..475723c006f9 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -764,29 +764,39 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
764 | if (usb_endpoint_is_bulk_in(endpoint)) { | 764 | if (usb_endpoint_is_bulk_in(endpoint)) { |
765 | /* we found a bulk in endpoint */ | 765 | /* we found a bulk in endpoint */ |
766 | dev_dbg(ddev, "found bulk in on endpoint %d\n", i); | 766 | dev_dbg(ddev, "found bulk in on endpoint %d\n", i); |
767 | bulk_in_endpoint[num_bulk_in] = endpoint; | 767 | if (num_bulk_in < MAX_NUM_PORTS) { |
768 | ++num_bulk_in; | 768 | bulk_in_endpoint[num_bulk_in] = endpoint; |
769 | ++num_bulk_in; | ||
770 | } | ||
769 | } | 771 | } |
770 | 772 | ||
771 | if (usb_endpoint_is_bulk_out(endpoint)) { | 773 | if (usb_endpoint_is_bulk_out(endpoint)) { |
772 | /* we found a bulk out endpoint */ | 774 | /* we found a bulk out endpoint */ |
773 | dev_dbg(ddev, "found bulk out on endpoint %d\n", i); | 775 | dev_dbg(ddev, "found bulk out on endpoint %d\n", i); |
774 | bulk_out_endpoint[num_bulk_out] = endpoint; | 776 | if (num_bulk_out < MAX_NUM_PORTS) { |
775 | ++num_bulk_out; | 777 | bulk_out_endpoint[num_bulk_out] = endpoint; |
778 | ++num_bulk_out; | ||
779 | } | ||
776 | } | 780 | } |
777 | 781 | ||
778 | if (usb_endpoint_is_int_in(endpoint)) { | 782 | if (usb_endpoint_is_int_in(endpoint)) { |
779 | /* we found a interrupt in endpoint */ | 783 | /* we found a interrupt in endpoint */ |
780 | dev_dbg(ddev, "found interrupt in on endpoint %d\n", i); | 784 | dev_dbg(ddev, "found interrupt in on endpoint %d\n", i); |
781 | interrupt_in_endpoint[num_interrupt_in] = endpoint; | 785 | if (num_interrupt_in < MAX_NUM_PORTS) { |
782 | ++num_interrupt_in; | 786 | interrupt_in_endpoint[num_interrupt_in] = |
787 | endpoint; | ||
788 | ++num_interrupt_in; | ||
789 | } | ||
783 | } | 790 | } |
784 | 791 | ||
785 | if (usb_endpoint_is_int_out(endpoint)) { | 792 | if (usb_endpoint_is_int_out(endpoint)) { |
786 | /* we found an interrupt out endpoint */ | 793 | /* we found an interrupt out endpoint */ |
787 | dev_dbg(ddev, "found interrupt out on endpoint %d\n", i); | 794 | dev_dbg(ddev, "found interrupt out on endpoint %d\n", i); |
788 | interrupt_out_endpoint[num_interrupt_out] = endpoint; | 795 | if (num_interrupt_out < MAX_NUM_PORTS) { |
789 | ++num_interrupt_out; | 796 | interrupt_out_endpoint[num_interrupt_out] = |
797 | endpoint; | ||
798 | ++num_interrupt_out; | ||
799 | } | ||
790 | } | 800 | } |
791 | } | 801 | } |
792 | 802 | ||
@@ -809,8 +819,10 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
809 | if (usb_endpoint_is_int_in(endpoint)) { | 819 | if (usb_endpoint_is_int_in(endpoint)) { |
810 | /* we found a interrupt in endpoint */ | 820 | /* we found a interrupt in endpoint */ |
811 | dev_dbg(ddev, "found interrupt in for Prolific device on separate interface\n"); | 821 | dev_dbg(ddev, "found interrupt in for Prolific device on separate interface\n"); |
812 | interrupt_in_endpoint[num_interrupt_in] = endpoint; | 822 | if (num_interrupt_in < MAX_NUM_PORTS) { |
813 | ++num_interrupt_in; | 823 | interrupt_in_endpoint[num_interrupt_in] = endpoint; |
824 | ++num_interrupt_in; | ||
825 | } | ||
814 | } | 826 | } |
815 | } | 827 | } |
816 | } | 828 | } |
@@ -850,6 +862,11 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
850 | num_ports = type->num_ports; | 862 | num_ports = type->num_ports; |
851 | } | 863 | } |
852 | 864 | ||
865 | if (num_ports > MAX_NUM_PORTS) { | ||
866 | dev_warn(ddev, "too many ports requested: %d\n", num_ports); | ||
867 | num_ports = MAX_NUM_PORTS; | ||
868 | } | ||
869 | |||
853 | serial->num_ports = num_ports; | 870 | serial->num_ports = num_ports; |
854 | serial->num_bulk_in = num_bulk_in; | 871 | serial->num_bulk_in = num_bulk_in; |
855 | serial->num_bulk_out = num_bulk_out; | 872 | serial->num_bulk_out = num_bulk_out; |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index e62f2dff8b7d..6c3734d2b45a 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
@@ -514,6 +514,10 @@ static void command_port_read_callback(struct urb *urb) | |||
514 | dev_dbg(&urb->dev->dev, "%s - command_info is NULL, exiting.\n", __func__); | 514 | dev_dbg(&urb->dev->dev, "%s - command_info is NULL, exiting.\n", __func__); |
515 | return; | 515 | return; |
516 | } | 516 | } |
517 | if (!urb->actual_length) { | ||
518 | dev_dbg(&urb->dev->dev, "%s - empty response, exiting.\n", __func__); | ||
519 | return; | ||
520 | } | ||
517 | if (status) { | 521 | if (status) { |
518 | dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n", __func__, status); | 522 | dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n", __func__, status); |
519 | if (status != -ENOENT) | 523 | if (status != -ENOENT) |
@@ -534,7 +538,8 @@ static void command_port_read_callback(struct urb *urb) | |||
534 | /* These are unsolicited reports from the firmware, hence no | 538 | /* These are unsolicited reports from the firmware, hence no |
535 | waiting command to wakeup */ | 539 | waiting command to wakeup */ |
536 | dev_dbg(&urb->dev->dev, "%s - event received\n", __func__); | 540 | dev_dbg(&urb->dev->dev, "%s - event received\n", __func__); |
537 | } else if (data[0] == WHITEHEAT_GET_DTR_RTS) { | 541 | } else if ((data[0] == WHITEHEAT_GET_DTR_RTS) && |
542 | (urb->actual_length - 1 <= sizeof(command_info->result_buffer))) { | ||
538 | memcpy(command_info->result_buffer, &data[1], | 543 | memcpy(command_info->result_buffer, &data[1], |
539 | urb->actual_length - 1); | 544 | urb->actual_length - 1); |
540 | command_info->command_finished = WHITEHEAT_CMD_COMPLETE; | 545 | command_info->command_finished = WHITEHEAT_CMD_COMPLETE; |
diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c index e40ab739c4a6..1a132e9e947a 100644 --- a/drivers/usb/serial/zte_ev.c +++ b/drivers/usb/serial/zte_ev.c | |||
@@ -272,28 +272,8 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
272 | } | 272 | } |
273 | 273 | ||
274 | static const struct usb_device_id id_table[] = { | 274 | static const struct usb_device_id id_table[] = { |
275 | /* AC8710, AC8710T */ | ||
276 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) }, | ||
277 | /* AC8700 */ | ||
278 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) }, | ||
279 | /* MG880 */ | 275 | /* MG880 */ |
280 | { USB_DEVICE(0x19d2, 0xfffd) }, | 276 | { USB_DEVICE(0x19d2, 0xfffd) }, |
281 | { USB_DEVICE(0x19d2, 0xfffc) }, | ||
282 | { USB_DEVICE(0x19d2, 0xfffb) }, | ||
283 | /* AC8710_V3 */ | ||
284 | { USB_DEVICE(0x19d2, 0xfff6) }, | ||
285 | { USB_DEVICE(0x19d2, 0xfff7) }, | ||
286 | { USB_DEVICE(0x19d2, 0xfff8) }, | ||
287 | { USB_DEVICE(0x19d2, 0xfff9) }, | ||
288 | { USB_DEVICE(0x19d2, 0xffee) }, | ||
289 | /* AC2716, MC2716 */ | ||
290 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) }, | ||
291 | /* AD3812 */ | ||
292 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) }, | ||
293 | { USB_DEVICE(0x19d2, 0xffec) }, | ||
294 | { USB_DEVICE(0x05C6, 0x3197) }, | ||
295 | { USB_DEVICE(0x05C6, 0x6000) }, | ||
296 | { USB_DEVICE(0x05C6, 0x9008) }, | ||
297 | { }, | 277 | { }, |
298 | }; | 278 | }; |
299 | MODULE_DEVICE_TABLE(usb, id_table); | 279 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 80a5b366255f..7ef99b2f3aaf 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -922,6 +922,12 @@ UNUSUAL_DEV( 0x069b, 0x3004, 0x0001, 0x0001, | |||
922 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 922 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
923 | US_FL_FIX_CAPACITY ), | 923 | US_FL_FIX_CAPACITY ), |
924 | 924 | ||
925 | UNUSUAL_DEV( 0x06ca, 0x2003, 0x0100, 0x0100, | ||
926 | "Newer Technology", | ||
927 | "uSCSI", | ||
928 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_euscsi_init, | ||
929 | US_FL_SCM_MULT_TARG ), | ||
930 | |||
925 | /* Reported by Adrian Pilchowiec <adi1981@epf.pl> */ | 931 | /* Reported by Adrian Pilchowiec <adi1981@epf.pl> */ |
926 | UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000, | 932 | UNUSUAL_DEV( 0x071b, 0x3203, 0x0000, 0x0000, |
927 | "RockChip", | 933 | "RockChip", |
diff --git a/drivers/staging/usbip/Kconfig b/drivers/usb/usbip/Kconfig index bd99e9e47e50..bd99e9e47e50 100644 --- a/drivers/staging/usbip/Kconfig +++ b/drivers/usb/usbip/Kconfig | |||
diff --git a/drivers/staging/usbip/Makefile b/drivers/usb/usbip/Makefile index 9ecd61545be1..9ecd61545be1 100644 --- a/drivers/staging/usbip/Makefile +++ b/drivers/usb/usbip/Makefile | |||
diff --git a/drivers/staging/usbip/README b/drivers/usb/usbip/README index 41a2cf2e77a6..41a2cf2e77a6 100644 --- a/drivers/staging/usbip/README +++ b/drivers/usb/usbip/README | |||
diff --git a/drivers/staging/usbip/stub.h b/drivers/usb/usbip/stub.h index 266e2b0ce9a8..266e2b0ce9a8 100644 --- a/drivers/staging/usbip/stub.h +++ b/drivers/usb/usbip/stub.h | |||
diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c index 51d0c7188738..fac20e0434c0 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/usb/usbip/stub_dev.c | |||
@@ -26,33 +26,6 @@ | |||
26 | #include "stub.h" | 26 | #include "stub.h" |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * Define device IDs here if you want to explicitly limit exportable devices. | ||
30 | * In most cases, wildcard matching will be okay because driver binding can be | ||
31 | * changed dynamically by a userland program. | ||
32 | */ | ||
33 | static struct usb_device_id stub_table[] = { | ||
34 | #if 0 | ||
35 | /* just an example */ | ||
36 | { USB_DEVICE(0x05ac, 0x0301) }, /* Mac 1 button mouse */ | ||
37 | { USB_DEVICE(0x0430, 0x0009) }, /* Plat Home Keyboard */ | ||
38 | { USB_DEVICE(0x059b, 0x0001) }, /* Iomega USB Zip 100 */ | ||
39 | { USB_DEVICE(0x04b3, 0x4427) }, /* IBM USB CD-ROM */ | ||
40 | { USB_DEVICE(0x05a9, 0xa511) }, /* LifeView USB cam */ | ||
41 | { USB_DEVICE(0x55aa, 0x0201) }, /* Imation card reader */ | ||
42 | { USB_DEVICE(0x046d, 0x0870) }, /* Qcam Express(QV-30) */ | ||
43 | { USB_DEVICE(0x04bb, 0x0101) }, /* IO-DATA HD 120GB */ | ||
44 | { USB_DEVICE(0x04bb, 0x0904) }, /* IO-DATA USB-ET/TX */ | ||
45 | { USB_DEVICE(0x04bb, 0x0201) }, /* IO-DATA USB-ET/TX */ | ||
46 | { USB_DEVICE(0x08bb, 0x2702) }, /* ONKYO USB Speaker */ | ||
47 | { USB_DEVICE(0x046d, 0x08b2) }, /* Logicool Qcam 4000 Pro */ | ||
48 | #endif | ||
49 | /* magic for wild card */ | ||
50 | { .driver_info = 1 }, | ||
51 | { 0, } /* Terminating entry */ | ||
52 | }; | ||
53 | MODULE_DEVICE_TABLE(usb, stub_table); | ||
54 | |||
55 | /* | ||
56 | * usbip_status shows the status of usbip-host as long as this driver is bound | 29 | * usbip_status shows the status of usbip-host as long as this driver is bound |
57 | * to the target device. | 30 | * to the target device. |
58 | */ | 31 | */ |
diff --git a/drivers/staging/usbip/stub_main.c b/drivers/usb/usbip/stub_main.c index 44ab43fc4fcc..44ab43fc4fcc 100644 --- a/drivers/staging/usbip/stub_main.c +++ b/drivers/usb/usbip/stub_main.c | |||
diff --git a/drivers/staging/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c index 00e475c51a12..00e475c51a12 100644 --- a/drivers/staging/usbip/stub_rx.c +++ b/drivers/usb/usbip/stub_rx.c | |||
diff --git a/drivers/staging/usbip/stub_tx.c b/drivers/usb/usbip/stub_tx.c index dbcabc9dbe0d..dbcabc9dbe0d 100644 --- a/drivers/staging/usbip/stub_tx.c +++ b/drivers/usb/usbip/stub_tx.c | |||
diff --git a/drivers/staging/usbip/usbip_common.c b/drivers/usb/usbip/usbip_common.c index facaaf003f19..facaaf003f19 100644 --- a/drivers/staging/usbip/usbip_common.c +++ b/drivers/usb/usbip/usbip_common.c | |||
diff --git a/drivers/staging/usbip/usbip_common.h b/drivers/usb/usbip/usbip_common.h index 4da3866a037d..86b08475c254 100644 --- a/drivers/staging/usbip/usbip_common.h +++ b/drivers/usb/usbip/usbip_common.h | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/types.h> | 29 | #include <linux/types.h> |
30 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
31 | #include <linux/wait.h> | 31 | #include <linux/wait.h> |
32 | #include "uapi/usbip.h" | 32 | #include <uapi/linux/usbip.h> |
33 | 33 | ||
34 | #define USBIP_VERSION "1.0.0" | 34 | #define USBIP_VERSION "1.0.0" |
35 | 35 | ||
diff --git a/drivers/staging/usbip/usbip_event.c b/drivers/usb/usbip/usbip_event.c index 64933b993d7a..64933b993d7a 100644 --- a/drivers/staging/usbip/usbip_event.c +++ b/drivers/usb/usbip/usbip_event.c | |||
diff --git a/drivers/staging/usbip/usbip_protocol.txt b/drivers/usb/usbip/usbip_protocol.txt index 16b6fe27284c..16b6fe27284c 100644 --- a/drivers/staging/usbip/usbip_protocol.txt +++ b/drivers/usb/usbip/usbip_protocol.txt | |||
diff --git a/drivers/staging/usbip/vhci.h b/drivers/usb/usbip/vhci.h index a863a98a91ce..a863a98a91ce 100644 --- a/drivers/staging/usbip/vhci.h +++ b/drivers/usb/usbip/vhci.h | |||
diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c index c02374b6049c..c02374b6049c 100644 --- a/drivers/staging/usbip/vhci_hcd.c +++ b/drivers/usb/usbip/vhci_hcd.c | |||
diff --git a/drivers/staging/usbip/vhci_rx.c b/drivers/usb/usbip/vhci_rx.c index 00e4a54308e4..00e4a54308e4 100644 --- a/drivers/staging/usbip/vhci_rx.c +++ b/drivers/usb/usbip/vhci_rx.c | |||
diff --git a/drivers/staging/usbip/vhci_sysfs.c b/drivers/usb/usbip/vhci_sysfs.c index 211f43f67ea2..211f43f67ea2 100644 --- a/drivers/staging/usbip/vhci_sysfs.c +++ b/drivers/usb/usbip/vhci_sysfs.c | |||
diff --git a/drivers/staging/usbip/vhci_tx.c b/drivers/usb/usbip/vhci_tx.c index 409fd99f3257..409fd99f3257 100644 --- a/drivers/staging/usbip/vhci_tx.c +++ b/drivers/usb/usbip/vhci_tx.c | |||
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index 3e2e4ed20157..e279015be466 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c | |||
@@ -2602,6 +2602,7 @@ static void wa_buf_in_cb(struct urb *urb) | |||
2602 | dev = &wa->usb_iface->dev; | 2602 | dev = &wa->usb_iface->dev; |
2603 | --(wa->active_buf_in_urbs); | 2603 | --(wa->active_buf_in_urbs); |
2604 | active_buf_in_urbs = wa->active_buf_in_urbs; | 2604 | active_buf_in_urbs = wa->active_buf_in_urbs; |
2605 | rpipe = xfer->ep->hcpriv; | ||
2605 | 2606 | ||
2606 | if (usb_pipeisoc(xfer->urb->pipe)) { | 2607 | if (usb_pipeisoc(xfer->urb->pipe)) { |
2607 | struct usb_iso_packet_descriptor *iso_frame_desc = | 2608 | struct usb_iso_packet_descriptor *iso_frame_desc = |
@@ -2659,7 +2660,6 @@ static void wa_buf_in_cb(struct urb *urb) | |||
2659 | resubmit_dti = (isoc_data_frame_count == | 2660 | resubmit_dti = (isoc_data_frame_count == |
2660 | urb_frame_count); | 2661 | urb_frame_count); |
2661 | } else if (active_buf_in_urbs == 0) { | 2662 | } else if (active_buf_in_urbs == 0) { |
2662 | rpipe = xfer->ep->hcpriv; | ||
2663 | dev_dbg(dev, | 2663 | dev_dbg(dev, |
2664 | "xfer %p 0x%08X#%u: data in done (%zu bytes)\n", | 2664 | "xfer %p 0x%08X#%u: data in done (%zu bytes)\n", |
2665 | xfer, wa_xfer_id(xfer), seg->index, | 2665 | xfer, wa_xfer_id(xfer), seg->index, |
@@ -2685,7 +2685,6 @@ static void wa_buf_in_cb(struct urb *urb) | |||
2685 | */ | 2685 | */ |
2686 | resubmit_dti = wa->dti_state != WA_DTI_TRANSFER_RESULT_PENDING; | 2686 | resubmit_dti = wa->dti_state != WA_DTI_TRANSFER_RESULT_PENDING; |
2687 | spin_lock_irqsave(&xfer->lock, flags); | 2687 | spin_lock_irqsave(&xfer->lock, flags); |
2688 | rpipe = xfer->ep->hcpriv; | ||
2689 | if (printk_ratelimit()) | 2688 | if (printk_ratelimit()) |
2690 | dev_err(dev, "xfer %p 0x%08X#%u: data in error %d\n", | 2689 | dev_err(dev, "xfer %p 0x%08X#%u: data in error %d\n", |
2691 | xfer, wa_xfer_id(xfer), seg->index, | 2690 | xfer, wa_xfer_id(xfer), seg->index, |
diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c index d7a3d13e72ec..b85983e97f0a 100644 --- a/drivers/video/backlight/pwm_bl.c +++ b/drivers/video/backlight/pwm_bl.c | |||
@@ -173,6 +173,7 @@ static int pwm_backlight_parse_dt(struct device *dev, | |||
173 | data->max_brightness--; | 173 | data->max_brightness--; |
174 | } | 174 | } |
175 | 175 | ||
176 | data->enable_gpio = -EINVAL; | ||
176 | return 0; | 177 | return 0; |
177 | } | 178 | } |
178 | 179 | ||
diff --git a/drivers/video/fbdev/amba-clcd.c b/drivers/video/fbdev/amba-clcd.c index beadd3edaa17..a7b6217ac87b 100644 --- a/drivers/video/fbdev/amba-clcd.c +++ b/drivers/video/fbdev/amba-clcd.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
25 | #include <linux/amba/bus.h> | 25 | #include <linux/amba/bus.h> |
26 | #include <linux/amba/clcd.h> | 26 | #include <linux/amba/clcd.h> |
27 | #include <linux/bitops.h> | ||
27 | #include <linux/clk.h> | 28 | #include <linux/clk.h> |
28 | #include <linux/hardirq.h> | 29 | #include <linux/hardirq.h> |
29 | #include <linux/dma-mapping.h> | 30 | #include <linux/dma-mapping.h> |
@@ -650,6 +651,7 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) | |||
650 | { | 651 | { |
651 | struct device_node *endpoint; | 652 | struct device_node *endpoint; |
652 | int err; | 653 | int err; |
654 | unsigned int bpp; | ||
653 | u32 max_bandwidth; | 655 | u32 max_bandwidth; |
654 | u32 tft_r0b0g0[3]; | 656 | u32 tft_r0b0g0[3]; |
655 | 657 | ||
@@ -667,11 +669,22 @@ static int clcdfb_of_init_display(struct clcd_fb *fb) | |||
667 | 669 | ||
668 | err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth", | 670 | err = of_property_read_u32(fb->dev->dev.of_node, "max-memory-bandwidth", |
669 | &max_bandwidth); | 671 | &max_bandwidth); |
670 | if (!err) | 672 | if (!err) { |
671 | fb->panel->bpp = 8 * max_bandwidth / (fb->panel->mode.xres * | 673 | /* |
672 | fb->panel->mode.yres * fb->panel->mode.refresh); | 674 | * max_bandwidth is in bytes per second and pixclock in |
673 | else | 675 | * pico-seconds, so the maximum allowed bits per pixel is |
674 | fb->panel->bpp = 32; | 676 | * 8 * max_bandwidth / (PICOS2KHZ(pixclock) * 1000) |
677 | * Rearrange this calculation to avoid overflow and then ensure | ||
678 | * result is a valid format. | ||
679 | */ | ||
680 | bpp = max_bandwidth / (1000 / 8) | ||
681 | / PICOS2KHZ(fb->panel->mode.pixclock); | ||
682 | bpp = rounddown_pow_of_two(bpp); | ||
683 | if (bpp > 32) | ||
684 | bpp = 32; | ||
685 | } else | ||
686 | bpp = 32; | ||
687 | fb->panel->bpp = bpp; | ||
675 | 688 | ||
676 | #ifdef CONFIG_CPU_BIG_ENDIAN | 689 | #ifdef CONFIG_CPU_BIG_ENDIAN |
677 | fb->panel->cntl |= CNTL_BEBO; | 690 | fb->panel->cntl |= CNTL_BEBO; |
diff --git a/drivers/video/fbdev/atmel_lcdfb.c b/drivers/video/fbdev/atmel_lcdfb.c index 92640d46770a..1d8bdb92939b 100644 --- a/drivers/video/fbdev/atmel_lcdfb.c +++ b/drivers/video/fbdev/atmel_lcdfb.c | |||
@@ -1102,12 +1102,14 @@ static int atmel_lcdfb_of_init(struct atmel_lcdfb_info *sinfo) | |||
1102 | timings = of_get_display_timings(display_np); | 1102 | timings = of_get_display_timings(display_np); |
1103 | if (!timings) { | 1103 | if (!timings) { |
1104 | dev_err(dev, "failed to get display timings\n"); | 1104 | dev_err(dev, "failed to get display timings\n"); |
1105 | ret = -EINVAL; | ||
1105 | goto put_display_node; | 1106 | goto put_display_node; |
1106 | } | 1107 | } |
1107 | 1108 | ||
1108 | timings_np = of_find_node_by_name(display_np, "display-timings"); | 1109 | timings_np = of_find_node_by_name(display_np, "display-timings"); |
1109 | if (!timings_np) { | 1110 | if (!timings_np) { |
1110 | dev_err(dev, "failed to find display-timings node\n"); | 1111 | dev_err(dev, "failed to find display-timings node\n"); |
1112 | ret = -ENODEV; | ||
1111 | goto put_display_node; | 1113 | goto put_display_node; |
1112 | } | 1114 | } |
1113 | 1115 | ||
diff --git a/drivers/video/fbdev/chipsfb.c b/drivers/video/fbdev/chipsfb.c index 206a66b61072..59abdc6a97f6 100644 --- a/drivers/video/fbdev/chipsfb.c +++ b/drivers/video/fbdev/chipsfb.c | |||
@@ -273,7 +273,7 @@ static struct chips_init_reg chips_init_xr[] = { | |||
273 | { 0xa8, 0x00 } | 273 | { 0xa8, 0x00 } |
274 | }; | 274 | }; |
275 | 275 | ||
276 | static void __init chips_hw_init(void) | 276 | static void chips_hw_init(void) |
277 | { | 277 | { |
278 | int i; | 278 | int i; |
279 | 279 | ||
diff --git a/drivers/video/fbdev/da8xx-fb.c b/drivers/video/fbdev/da8xx-fb.c index 788f6b37fce7..10c876c95772 100644 --- a/drivers/video/fbdev/da8xx-fb.c +++ b/drivers/video/fbdev/da8xx-fb.c | |||
@@ -419,7 +419,7 @@ static void lcd_cfg_horizontal_sync(int back_porch, int pulse_width, | |||
419 | { | 419 | { |
420 | u32 reg; | 420 | u32 reg; |
421 | 421 | ||
422 | reg = lcdc_read(LCD_RASTER_TIMING_0_REG) & 0xf; | 422 | reg = lcdc_read(LCD_RASTER_TIMING_0_REG) & 0x3ff; |
423 | reg |= (((back_porch-1) & 0xff) << 24) | 423 | reg |= (((back_porch-1) & 0xff) << 24) |
424 | | (((front_porch-1) & 0xff) << 16) | 424 | | (((front_porch-1) & 0xff) << 16) |
425 | | (((pulse_width-1) & 0x3f) << 10); | 425 | | (((pulse_width-1) & 0x3f) << 10); |
diff --git a/drivers/video/of_display_timing.c b/drivers/video/of_display_timing.c index 987edf110038..5c098d5b4043 100644 --- a/drivers/video/of_display_timing.c +++ b/drivers/video/of_display_timing.c | |||
@@ -236,6 +236,7 @@ timingfail: | |||
236 | if (native_mode) | 236 | if (native_mode) |
237 | of_node_put(native_mode); | 237 | of_node_put(native_mode); |
238 | display_timings_release(disp); | 238 | display_timings_release(disp); |
239 | disp = NULL; | ||
239 | entryfail: | 240 | entryfail: |
240 | kfree(disp); | 241 | kfree(disp); |
241 | dispfail: | 242 | dispfail: |