diff options
author | John W. Linville <linville@tuxdriver.com> | 2006-08-04 14:24:15 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2006-08-04 14:24:15 -0400 |
commit | 71bfe47f023c55c322607939b786ce0a44627dfc (patch) | |
tree | f59c37feb00f1df2e0f4ec282ae9c80ad6bb0cdc /drivers | |
parent | 73c1ac1e3b6c989b9b5f7b2313ac590a1c3b6d6a (diff) | |
parent | efe78cda3596f8a6d1c2d4a6b1a221bafa3e1a48 (diff) |
Merge branch 'from-linus' into upstream
Diffstat (limited to 'drivers')
85 files changed, 990 insertions, 810 deletions
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 1c0a39d8b04e..578b99b71d9c 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -58,8 +58,8 @@ struct dock_dependent_device { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | #define DOCK_DOCKING 0x00000001 | 60 | #define DOCK_DOCKING 0x00000001 |
61 | #define DOCK_EVENT KOBJ_DOCK | 61 | #define DOCK_EVENT 3 |
62 | #define UNDOCK_EVENT KOBJ_UNDOCK | 62 | #define UNDOCK_EVENT 2 |
63 | 63 | ||
64 | static struct dock_station *dock_station; | 64 | static struct dock_station *dock_station; |
65 | 65 | ||
@@ -322,11 +322,10 @@ static void hotplug_dock_devices(struct dock_station *ds, u32 event) | |||
322 | 322 | ||
323 | static void dock_event(struct dock_station *ds, u32 event, int num) | 323 | static void dock_event(struct dock_station *ds, u32 event, int num) |
324 | { | 324 | { |
325 | struct acpi_device *device; | 325 | /* |
326 | 326 | * we don't do events until someone tells me that | |
327 | device = dock_create_acpi_device(ds->handle); | 327 | * they would like to have them. |
328 | if (device) | 328 | */ |
329 | kobject_uevent(&device->kobj, num); | ||
330 | } | 329 | } |
331 | 330 | ||
332 | /** | 331 | /** |
diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c index afc6eda602f7..07e0b75f2338 100644 --- a/drivers/char/snsc.c +++ b/drivers/char/snsc.c | |||
@@ -374,7 +374,12 @@ scdrv_init(void) | |||
374 | struct sysctl_data_s *scd; | 374 | struct sysctl_data_s *scd; |
375 | void *salbuf; | 375 | void *salbuf; |
376 | dev_t first_dev, dev; | 376 | dev_t first_dev, dev; |
377 | nasid_t event_nasid = ia64_sn_get_console_nasid(); | 377 | nasid_t event_nasid; |
378 | |||
379 | if (!ia64_platform_is("sn2")) | ||
380 | return -ENODEV; | ||
381 | |||
382 | event_nasid = ia64_sn_get_console_nasid(); | ||
378 | 383 | ||
379 | if (alloc_chrdev_region(&first_dev, 0, num_cnodes, | 384 | if (alloc_chrdev_region(&first_dev, 0, num_cnodes, |
380 | SYSCTL_BASENAME) < 0) { | 385 | SYSCTL_BASENAME) < 0) { |
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c index d294bbc42f09..1205e8027829 100644 --- a/drivers/infiniband/core/addr.c +++ b/drivers/infiniband/core/addr.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <net/arp.h> | 35 | #include <net/arp.h> |
36 | #include <net/neighbour.h> | 36 | #include <net/neighbour.h> |
37 | #include <net/route.h> | 37 | #include <net/route.h> |
38 | #include <net/netevent.h> | ||
38 | #include <rdma/ib_addr.h> | 39 | #include <rdma/ib_addr.h> |
39 | 40 | ||
40 | MODULE_AUTHOR("Sean Hefty"); | 41 | MODULE_AUTHOR("Sean Hefty"); |
@@ -326,25 +327,22 @@ void rdma_addr_cancel(struct rdma_dev_addr *addr) | |||
326 | } | 327 | } |
327 | EXPORT_SYMBOL(rdma_addr_cancel); | 328 | EXPORT_SYMBOL(rdma_addr_cancel); |
328 | 329 | ||
329 | static int addr_arp_recv(struct sk_buff *skb, struct net_device *dev, | 330 | static int netevent_callback(struct notifier_block *self, unsigned long event, |
330 | struct packet_type *pkt, struct net_device *orig_dev) | 331 | void *ctx) |
331 | { | 332 | { |
332 | struct arphdr *arp_hdr; | 333 | if (event == NETEVENT_NEIGH_UPDATE) { |
334 | struct neighbour *neigh = ctx; | ||
333 | 335 | ||
334 | arp_hdr = (struct arphdr *) skb->nh.raw; | 336 | if (neigh->dev->type == ARPHRD_INFINIBAND && |
335 | 337 | (neigh->nud_state & NUD_VALID)) { | |
336 | if (arp_hdr->ar_op == htons(ARPOP_REQUEST) || | 338 | set_timeout(jiffies); |
337 | arp_hdr->ar_op == htons(ARPOP_REPLY)) | 339 | } |
338 | set_timeout(jiffies); | 340 | } |
339 | |||
340 | kfree_skb(skb); | ||
341 | return 0; | 341 | return 0; |
342 | } | 342 | } |
343 | 343 | ||
344 | static struct packet_type addr_arp = { | 344 | static struct notifier_block nb = { |
345 | .type = __constant_htons(ETH_P_ARP), | 345 | .notifier_call = netevent_callback |
346 | .func = addr_arp_recv, | ||
347 | .af_packet_priv = (void*) 1, | ||
348 | }; | 346 | }; |
349 | 347 | ||
350 | static int addr_init(void) | 348 | static int addr_init(void) |
@@ -353,13 +351,13 @@ static int addr_init(void) | |||
353 | if (!addr_wq) | 351 | if (!addr_wq) |
354 | return -ENOMEM; | 352 | return -ENOMEM; |
355 | 353 | ||
356 | dev_add_pack(&addr_arp); | 354 | register_netevent_notifier(&nb); |
357 | return 0; | 355 | return 0; |
358 | } | 356 | } |
359 | 357 | ||
360 | static void addr_cleanup(void) | 358 | static void addr_cleanup(void) |
361 | { | 359 | { |
362 | dev_remove_pack(&addr_arp); | 360 | unregister_netevent_notifier(&nb); |
363 | destroy_workqueue(addr_wq); | 361 | destroy_workqueue(addr_wq); |
364 | } | 362 | } |
365 | 363 | ||
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index f85c97f7500a..0de335b7bfc2 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -975,8 +975,10 @@ int ib_send_cm_req(struct ib_cm_id *cm_id, | |||
975 | 975 | ||
976 | cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv-> | 976 | cm_id_priv->timewait_info = cm_create_timewait_info(cm_id_priv-> |
977 | id.local_id); | 977 | id.local_id); |
978 | if (IS_ERR(cm_id_priv->timewait_info)) | 978 | if (IS_ERR(cm_id_priv->timewait_info)) { |
979 | ret = PTR_ERR(cm_id_priv->timewait_info); | ||
979 | goto out; | 980 | goto out; |
981 | } | ||
980 | 982 | ||
981 | ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); | 983 | ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); |
982 | if (ret) | 984 | if (ret) |
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index bb9bee56a824..102a59c033ff 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/kref.h> | 42 | #include <linux/kref.h> |
43 | #include <linux/idr.h> | 43 | #include <linux/idr.h> |
44 | #include <linux/mutex.h> | 44 | #include <linux/mutex.h> |
45 | #include <linux/completion.h> | ||
45 | 46 | ||
46 | #include <rdma/ib_verbs.h> | 47 | #include <rdma/ib_verbs.h> |
47 | #include <rdma/ib_user_verbs.h> | 48 | #include <rdma/ib_user_verbs.h> |
@@ -69,6 +70,7 @@ | |||
69 | 70 | ||
70 | struct ib_uverbs_device { | 71 | struct ib_uverbs_device { |
71 | struct kref ref; | 72 | struct kref ref; |
73 | struct completion comp; | ||
72 | int devnum; | 74 | int devnum; |
73 | struct cdev *dev; | 75 | struct cdev *dev; |
74 | struct class_device *class_dev; | 76 | struct class_device *class_dev; |
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index e725cccc7cde..4e16314e8e6d 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
@@ -122,7 +122,7 @@ static void ib_uverbs_release_dev(struct kref *ref) | |||
122 | struct ib_uverbs_device *dev = | 122 | struct ib_uverbs_device *dev = |
123 | container_of(ref, struct ib_uverbs_device, ref); | 123 | container_of(ref, struct ib_uverbs_device, ref); |
124 | 124 | ||
125 | kfree(dev); | 125 | complete(&dev->comp); |
126 | } | 126 | } |
127 | 127 | ||
128 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, | 128 | void ib_uverbs_release_ucq(struct ib_uverbs_file *file, |
@@ -740,6 +740,7 @@ static void ib_uverbs_add_one(struct ib_device *device) | |||
740 | return; | 740 | return; |
741 | 741 | ||
742 | kref_init(&uverbs_dev->ref); | 742 | kref_init(&uverbs_dev->ref); |
743 | init_completion(&uverbs_dev->comp); | ||
743 | 744 | ||
744 | spin_lock(&map_lock); | 745 | spin_lock(&map_lock); |
745 | uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES); | 746 | uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES); |
@@ -793,6 +794,8 @@ err_cdev: | |||
793 | 794 | ||
794 | err: | 795 | err: |
795 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); | 796 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); |
797 | wait_for_completion(&uverbs_dev->comp); | ||
798 | kfree(uverbs_dev); | ||
796 | return; | 799 | return; |
797 | } | 800 | } |
798 | 801 | ||
@@ -812,7 +815,10 @@ static void ib_uverbs_remove_one(struct ib_device *device) | |||
812 | spin_unlock(&map_lock); | 815 | spin_unlock(&map_lock); |
813 | 816 | ||
814 | clear_bit(uverbs_dev->devnum, dev_map); | 817 | clear_bit(uverbs_dev->devnum, dev_map); |
818 | |||
815 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); | 819 | kref_put(&uverbs_dev->ref, ib_uverbs_release_dev); |
820 | wait_for_completion(&uverbs_dev->comp); | ||
821 | kfree(uverbs_dev); | ||
816 | } | 822 | } |
817 | 823 | ||
818 | static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags, | 824 | static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags, |
diff --git a/drivers/infiniband/hw/mthca/mthca_allocator.c b/drivers/infiniband/hw/mthca/mthca_allocator.c index 9ba3211cef7c..25157f57a6d0 100644 --- a/drivers/infiniband/hw/mthca/mthca_allocator.c +++ b/drivers/infiniband/hw/mthca/mthca_allocator.c | |||
@@ -108,14 +108,15 @@ void mthca_alloc_cleanup(struct mthca_alloc *alloc) | |||
108 | * serialize access to the array. | 108 | * serialize access to the array. |
109 | */ | 109 | */ |
110 | 110 | ||
111 | #define MTHCA_ARRAY_MASK (PAGE_SIZE / sizeof (void *) - 1) | ||
112 | |||
111 | void *mthca_array_get(struct mthca_array *array, int index) | 113 | void *mthca_array_get(struct mthca_array *array, int index) |
112 | { | 114 | { |
113 | int p = (index * sizeof (void *)) >> PAGE_SHIFT; | 115 | int p = (index * sizeof (void *)) >> PAGE_SHIFT; |
114 | 116 | ||
115 | if (array->page_list[p].page) { | 117 | if (array->page_list[p].page) |
116 | int i = index & (PAGE_SIZE / sizeof (void *) - 1); | 118 | return array->page_list[p].page[index & MTHCA_ARRAY_MASK]; |
117 | return array->page_list[p].page[i]; | 119 | else |
118 | } else | ||
119 | return NULL; | 120 | return NULL; |
120 | } | 121 | } |
121 | 122 | ||
@@ -130,8 +131,7 @@ int mthca_array_set(struct mthca_array *array, int index, void *value) | |||
130 | if (!array->page_list[p].page) | 131 | if (!array->page_list[p].page) |
131 | return -ENOMEM; | 132 | return -ENOMEM; |
132 | 133 | ||
133 | array->page_list[p].page[index & (PAGE_SIZE / sizeof (void *) - 1)] = | 134 | array->page_list[p].page[index & MTHCA_ARRAY_MASK] = value; |
134 | value; | ||
135 | ++array->page_list[p].used; | 135 | ++array->page_list[p].used; |
136 | 136 | ||
137 | return 0; | 137 | return 0; |
@@ -144,7 +144,8 @@ void mthca_array_clear(struct mthca_array *array, int index) | |||
144 | if (--array->page_list[p].used == 0) { | 144 | if (--array->page_list[p].used == 0) { |
145 | free_page((unsigned long) array->page_list[p].page); | 145 | free_page((unsigned long) array->page_list[p].page); |
146 | array->page_list[p].page = NULL; | 146 | array->page_list[p].page = NULL; |
147 | } | 147 | } else |
148 | array->page_list[p].page[index & MTHCA_ARRAY_MASK] = NULL; | ||
148 | 149 | ||
149 | if (array->page_list[p].used < 0) | 150 | if (array->page_list[p].used < 0) |
150 | pr_debug("Array %p index %d page %d with ref count %d < 0\n", | 151 | pr_debug("Array %p index %d page %d with ref count %d < 0\n", |
diff --git a/drivers/infiniband/ulp/ipoib/Kconfig b/drivers/infiniband/ulp/ipoib/Kconfig index 13d6d01c72c0..d74653d7de1c 100644 --- a/drivers/infiniband/ulp/ipoib/Kconfig +++ b/drivers/infiniband/ulp/ipoib/Kconfig | |||
@@ -6,8 +6,7 @@ config INFINIBAND_IPOIB | |||
6 | transports IP packets over InfiniBand so you can use your IB | 6 | transports IP packets over InfiniBand so you can use your IB |
7 | device as a fancy NIC. | 7 | device as a fancy NIC. |
8 | 8 | ||
9 | The IPoIB protocol is defined by the IETF ipoib working | 9 | See Documentation/infiniband/ipoib.txt for more information |
10 | group: <http://www.ietf.org/html.charters/ipoib-charter.html>. | ||
11 | 10 | ||
12 | config INFINIBAND_IPOIB_DEBUG | 11 | config INFINIBAND_IPOIB_DEBUG |
13 | bool "IP-over-InfiniBand debugging" if EMBEDDED | 12 | bool "IP-over-InfiniBand debugging" if EMBEDDED |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 8f472e7113b4..8257d5a2c8f8 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -77,6 +77,14 @@ MODULE_PARM_DESC(topspin_workarounds, | |||
77 | 77 | ||
78 | static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad }; | 78 | static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad }; |
79 | 79 | ||
80 | static int mellanox_workarounds = 1; | ||
81 | |||
82 | module_param(mellanox_workarounds, int, 0444); | ||
83 | MODULE_PARM_DESC(mellanox_workarounds, | ||
84 | "Enable workarounds for Mellanox SRP target bugs if != 0"); | ||
85 | |||
86 | static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 }; | ||
87 | |||
80 | static void srp_add_one(struct ib_device *device); | 88 | static void srp_add_one(struct ib_device *device); |
81 | static void srp_remove_one(struct ib_device *device); | 89 | static void srp_remove_one(struct ib_device *device); |
82 | static void srp_completion(struct ib_cq *cq, void *target_ptr); | 90 | static void srp_completion(struct ib_cq *cq, void *target_ptr); |
@@ -526,8 +534,10 @@ static int srp_reconnect_target(struct srp_target_port *target) | |||
526 | while (ib_poll_cq(target->cq, 1, &wc) > 0) | 534 | while (ib_poll_cq(target->cq, 1, &wc) > 0) |
527 | ; /* nothing */ | 535 | ; /* nothing */ |
528 | 536 | ||
537 | spin_lock_irq(target->scsi_host->host_lock); | ||
529 | list_for_each_entry_safe(req, tmp, &target->req_queue, list) | 538 | list_for_each_entry_safe(req, tmp, &target->req_queue, list) |
530 | srp_reset_req(target, req); | 539 | srp_reset_req(target, req); |
540 | spin_unlock_irq(target->scsi_host->host_lock); | ||
531 | 541 | ||
532 | target->rx_head = 0; | 542 | target->rx_head = 0; |
533 | target->tx_head = 0; | 543 | target->tx_head = 0; |
@@ -567,7 +577,7 @@ err: | |||
567 | return ret; | 577 | return ret; |
568 | } | 578 | } |
569 | 579 | ||
570 | static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat, | 580 | static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat, |
571 | int sg_cnt, struct srp_request *req, | 581 | int sg_cnt, struct srp_request *req, |
572 | struct srp_direct_buf *buf) | 582 | struct srp_direct_buf *buf) |
573 | { | 583 | { |
@@ -577,10 +587,15 @@ static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat, | |||
577 | int page_cnt; | 587 | int page_cnt; |
578 | int i, j; | 588 | int i, j; |
579 | int ret; | 589 | int ret; |
590 | struct srp_device *dev = target->srp_host->dev; | ||
580 | 591 | ||
581 | if (!dev->fmr_pool) | 592 | if (!dev->fmr_pool) |
582 | return -ENODEV; | 593 | return -ENODEV; |
583 | 594 | ||
595 | if ((sg_dma_address(&scat[0]) & ~dev->fmr_page_mask) && | ||
596 | mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3)) | ||
597 | return -EINVAL; | ||
598 | |||
584 | len = page_cnt = 0; | 599 | len = page_cnt = 0; |
585 | for (i = 0; i < sg_cnt; ++i) { | 600 | for (i = 0; i < sg_cnt; ++i) { |
586 | if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) { | 601 | if (sg_dma_address(&scat[i]) & ~dev->fmr_page_mask) { |
@@ -683,7 +698,7 @@ static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target, | |||
683 | buf->va = cpu_to_be64(sg_dma_address(scat)); | 698 | buf->va = cpu_to_be64(sg_dma_address(scat)); |
684 | buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey); | 699 | buf->key = cpu_to_be32(target->srp_host->dev->mr->rkey); |
685 | buf->len = cpu_to_be32(sg_dma_len(scat)); | 700 | buf->len = cpu_to_be32(sg_dma_len(scat)); |
686 | } else if (srp_map_fmr(target->srp_host->dev, scat, count, req, | 701 | } else if (srp_map_fmr(target, scat, count, req, |
687 | (void *) cmd->add_data)) { | 702 | (void *) cmd->add_data)) { |
688 | /* | 703 | /* |
689 | * FMR mapping failed, and the scatterlist has more | 704 | * FMR mapping failed, and the scatterlist has more |
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 59ac35ddd51e..57b34cda99f5 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -526,7 +526,9 @@ static int dvb_frontend_thread(void *data) | |||
526 | fepriv->delay = 3*HZ; | 526 | fepriv->delay = 3*HZ; |
527 | fepriv->status = 0; | 527 | fepriv->status = 0; |
528 | fepriv->wakeup = 0; | 528 | fepriv->wakeup = 0; |
529 | fepriv->reinitialise = 1; | 529 | fepriv->reinitialise = 0; |
530 | |||
531 | dvb_frontend_init(fe); | ||
530 | 532 | ||
531 | while (1) { | 533 | while (1) { |
532 | up(&fepriv->sem); /* is locked when we enter the thread... */ | 534 | up(&fepriv->sem); /* is locked when we enter the thread... */ |
@@ -1013,17 +1015,18 @@ static int dvb_frontend_open(struct inode *inode, struct file *file) | |||
1013 | return ret; | 1015 | return ret; |
1014 | 1016 | ||
1015 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 1017 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { |
1018 | |||
1019 | /* normal tune mode when opened R/W */ | ||
1020 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
1021 | fepriv->tone = -1; | ||
1022 | fepriv->voltage = -1; | ||
1023 | |||
1016 | ret = dvb_frontend_start (fe); | 1024 | ret = dvb_frontend_start (fe); |
1017 | if (ret) | 1025 | if (ret) |
1018 | dvb_generic_release (inode, file); | 1026 | dvb_generic_release (inode, file); |
1019 | 1027 | ||
1020 | /* empty event queue */ | 1028 | /* empty event queue */ |
1021 | fepriv->events.eventr = fepriv->events.eventw = 0; | 1029 | fepriv->events.eventr = fepriv->events.eventw = 0; |
1022 | |||
1023 | /* normal tune mode when opened R/W */ | ||
1024 | fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT; | ||
1025 | fepriv->tone = -1; | ||
1026 | fepriv->voltage = -1; | ||
1027 | } | 1030 | } |
1028 | 1031 | ||
1029 | return ret; | 1032 | return ret; |
diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c index a189683454b7..2be33f27c69f 100644 --- a/drivers/media/dvb/frontends/dvb-pll.c +++ b/drivers/media/dvb/frontends/dvb-pll.c | |||
@@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = { | |||
194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, | 194 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, |
195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, | 195 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, |
196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, | 196 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, |
197 | { 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 197 | { 444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
198 | { 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ }, | 198 | { 583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1 00 */ }, |
199 | { 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ }, | 199 | { 793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1 00 */ }, |
200 | { 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | 200 | { 444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1 00 */ }, |
201 | { 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ }, | 201 | { 861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1 00 */ }, |
202 | } | 202 | } |
203 | }; | 203 | }; |
204 | EXPORT_SYMBOL(dvb_pll_tda665x); | 204 | EXPORT_SYMBOL(dvb_pll_tda665x); |
@@ -613,7 +613,21 @@ static struct dvb_tuner_ops dvb_pll_tuner_ops = { | |||
613 | 613 | ||
614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) | 614 | int dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, struct i2c_adapter *i2c, struct dvb_pll_desc *desc) |
615 | { | 615 | { |
616 | u8 b1 [] = { 0 }; | ||
617 | struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .buf = b1, .len = 1 }; | ||
616 | struct dvb_pll_priv *priv = NULL; | 618 | struct dvb_pll_priv *priv = NULL; |
619 | int ret; | ||
620 | |||
621 | if (i2c != NULL) { | ||
622 | if (fe->ops.i2c_gate_ctrl) | ||
623 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
624 | |||
625 | ret = i2c_transfer (i2c, &msg, 1); | ||
626 | if (ret != 1) | ||
627 | return -1; | ||
628 | if (fe->ops.i2c_gate_ctrl) | ||
629 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
630 | } | ||
617 | 631 | ||
618 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); | 632 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); |
619 | if (priv == NULL) | 633 | if (priv == NULL) |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 500f15c10aaf..4506165c5de2 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
@@ -2203,8 +2203,8 @@ static int frontend_init(struct av7110 *av7110) | |||
2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; | 2203 | av7110->fe->ops.tuner_ops.set_params = nexusca_stv0297_tuner_set_params; |
2204 | 2204 | ||
2205 | /* set TDA9819 into DVB mode */ | 2205 | /* set TDA9819 into DVB mode */ |
2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 2206 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 2207 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
2208 | 2208 | ||
2209 | /* tuner on this needs a slower i2c bus speed */ | 2209 | /* tuner on this needs a slower i2c bus speed */ |
2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; | 2210 | av7110->dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240; |
diff --git a/drivers/media/dvb/ttpci/av7110_v4l.c b/drivers/media/dvb/ttpci/av7110_v4l.c index 64055461559d..6ffe53fdcf57 100644 --- a/drivers/media/dvb/ttpci/av7110_v4l.c +++ b/drivers/media/dvb/ttpci/av7110_v4l.c | |||
@@ -272,8 +272,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) | 272 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x60)) |
273 | dprintk(1, "setting band in demodulator failed.\n"); | 273 | dprintk(1, "setting band in demodulator failed.\n"); |
274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 274 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9198 pin9(STD) | 275 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // TDA9819 pin9(STD) |
276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9198 pin30(VIF) | 276 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI); // TDA9819 pin30(VIF) |
277 | } | 277 | } |
278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) | 278 | if (i2c_writereg(av7110, 0x48, 0x02, 0xd0) != 1) |
279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); | 279 | dprintk(1, "saa7113 write failed @ card %d", av7110->dvb_adapter.num); |
@@ -308,8 +308,8 @@ static int av7110_dvb_c_switch(struct saa7146_fh *fh) | |||
308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) | 308 | if (ves1820_writereg(dev, 0x09, 0x0f, 0x20)) |
309 | dprintk(1, "setting band in demodulator failed.\n"); | 309 | dprintk(1, "setting band in demodulator failed.\n"); |
310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 310 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 311 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 312 | saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
313 | } | 313 | } |
314 | } | 314 | } |
315 | 315 | ||
@@ -750,8 +750,8 @@ int av7110_init_analog_module(struct av7110 *av7110) | |||
750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) | 750 | if (ves1820_writereg(av7110->dev, 0x09, 0x0f, 0x20)) |
751 | dprintk(1, "setting band in demodulator failed.\n"); | 751 | dprintk(1, "setting band in demodulator failed.\n"); |
752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { | 752 | } else if (av7110->analog_tuner_flags & ANALOG_TUNER_STV0297) { |
753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9198 pin9(STD) | 753 | saa7146_setgpio(av7110->dev, 1, SAA7146_GPIO_OUTLO); // TDA9819 pin9(STD) |
754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9198 pin30(VIF) | 754 | saa7146_setgpio(av7110->dev, 3, SAA7146_GPIO_OUTLO); // TDA9819 pin30(VIF) |
755 | } | 755 | } |
756 | 756 | ||
757 | /* init the saa7113 */ | 757 | /* init the saa7113 */ |
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 5f111d407730..2d21fec23b4d 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c | |||
@@ -1303,6 +1303,9 @@ static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
1303 | budget_av->budget.dvb_adapter.priv = budget_av; | 1303 | budget_av->budget.dvb_adapter.priv = budget_av; |
1304 | frontend_init(budget_av); | 1304 | frontend_init(budget_av); |
1305 | ciintf_init(budget_av); | 1305 | ciintf_init(budget_av); |
1306 | |||
1307 | ttpci_budget_init_hooks(&budget_av->budget); | ||
1308 | |||
1306 | return 0; | 1309 | return 0; |
1307 | } | 1310 | } |
1308 | 1311 | ||
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index 4b966eea3834..ffbbb3e34be4 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
@@ -1101,6 +1101,8 @@ static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extensio | |||
1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; | 1101 | budget_ci->budget.dvb_adapter.priv = budget_ci; |
1102 | frontend_init(budget_ci); | 1102 | frontend_init(budget_ci); |
1103 | 1103 | ||
1104 | ttpci_budget_init_hooks(&budget_ci->budget); | ||
1105 | |||
1104 | return 0; | 1106 | return 0; |
1105 | } | 1107 | } |
1106 | 1108 | ||
diff --git a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c index e4cf7775e07f..e15562f81664 100644 --- a/drivers/media/dvb/ttpci/budget-core.c +++ b/drivers/media/dvb/ttpci/budget-core.c | |||
@@ -63,9 +63,6 @@ static int stop_ts_capture(struct budget *budget) | |||
63 | { | 63 | { |
64 | dprintk(2, "budget: %p\n", budget); | 64 | dprintk(2, "budget: %p\n", budget); |
65 | 65 | ||
66 | if (--budget->feeding) | ||
67 | return budget->feeding; | ||
68 | |||
69 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off | 66 | saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off |
70 | SAA7146_IER_DISABLE(budget->dev, MASK_10); | 67 | SAA7146_IER_DISABLE(budget->dev, MASK_10); |
71 | return 0; | 68 | return 0; |
@@ -77,8 +74,8 @@ static int start_ts_capture(struct budget *budget) | |||
77 | 74 | ||
78 | dprintk(2, "budget: %p\n", budget); | 75 | dprintk(2, "budget: %p\n", budget); |
79 | 76 | ||
80 | if (budget->feeding) | 77 | if (!budget->feeding || !budget->fe_synced) |
81 | return ++budget->feeding; | 78 | return 0; |
82 | 79 | ||
83 | saa7146_write(dev, MC1, MASK_20); // DMA3 off | 80 | saa7146_write(dev, MC1, MASK_20); // DMA3 off |
84 | 81 | ||
@@ -139,7 +136,33 @@ static int start_ts_capture(struct budget *budget) | |||
139 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ | 136 | SAA7146_IER_ENABLE(budget->dev, MASK_10); /* VPE */ |
140 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ | 137 | saa7146_write(dev, MC1, (MASK_04 | MASK_20)); /* DMA3 on */ |
141 | 138 | ||
142 | return ++budget->feeding; | 139 | return 0; |
140 | } | ||
141 | |||
142 | static int budget_read_fe_status(struct dvb_frontend *fe, fe_status_t *status) | ||
143 | { | ||
144 | struct budget *budget = (struct budget *) fe->dvb->priv; | ||
145 | int synced; | ||
146 | int ret; | ||
147 | |||
148 | if (budget->read_fe_status) | ||
149 | ret = budget->read_fe_status(fe, status); | ||
150 | else | ||
151 | ret = -EINVAL; | ||
152 | |||
153 | if (!ret) { | ||
154 | synced = (*status & FE_HAS_LOCK); | ||
155 | if (synced != budget->fe_synced) { | ||
156 | budget->fe_synced = synced; | ||
157 | spin_lock(&budget->feedlock); | ||
158 | if (synced) | ||
159 | start_ts_capture(budget); | ||
160 | else | ||
161 | stop_ts_capture(budget); | ||
162 | spin_unlock(&budget->feedlock); | ||
163 | } | ||
164 | } | ||
165 | return ret; | ||
143 | } | 166 | } |
144 | 167 | ||
145 | static void vpeirq(unsigned long data) | 168 | static void vpeirq(unsigned long data) |
@@ -267,7 +290,7 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
267 | { | 290 | { |
268 | struct dvb_demux *demux = feed->demux; | 291 | struct dvb_demux *demux = feed->demux; |
269 | struct budget *budget = (struct budget *) demux->priv; | 292 | struct budget *budget = (struct budget *) demux->priv; |
270 | int status; | 293 | int status = 0; |
271 | 294 | ||
272 | dprintk(2, "budget: %p\n", budget); | 295 | dprintk(2, "budget: %p\n", budget); |
273 | 296 | ||
@@ -276,7 +299,8 @@ static int budget_start_feed(struct dvb_demux_feed *feed) | |||
276 | 299 | ||
277 | spin_lock(&budget->feedlock); | 300 | spin_lock(&budget->feedlock); |
278 | feed->pusi_seen = 0; /* have a clean section start */ | 301 | feed->pusi_seen = 0; /* have a clean section start */ |
279 | status = start_ts_capture(budget); | 302 | if (budget->feeding++ == 0) |
303 | status = start_ts_capture(budget); | ||
280 | spin_unlock(&budget->feedlock); | 304 | spin_unlock(&budget->feedlock); |
281 | return status; | 305 | return status; |
282 | } | 306 | } |
@@ -285,12 +309,13 @@ static int budget_stop_feed(struct dvb_demux_feed *feed) | |||
285 | { | 309 | { |
286 | struct dvb_demux *demux = feed->demux; | 310 | struct dvb_demux *demux = feed->demux; |
287 | struct budget *budget = (struct budget *) demux->priv; | 311 | struct budget *budget = (struct budget *) demux->priv; |
288 | int status; | 312 | int status = 0; |
289 | 313 | ||
290 | dprintk(2, "budget: %p\n", budget); | 314 | dprintk(2, "budget: %p\n", budget); |
291 | 315 | ||
292 | spin_lock(&budget->feedlock); | 316 | spin_lock(&budget->feedlock); |
293 | status = stop_ts_capture(budget); | 317 | if (--budget->feeding == 0) |
318 | status = stop_ts_capture(budget); | ||
294 | spin_unlock(&budget->feedlock); | 319 | spin_unlock(&budget->feedlock); |
295 | return status; | 320 | return status; |
296 | } | 321 | } |
@@ -470,6 +495,14 @@ err: | |||
470 | return ret; | 495 | return ret; |
471 | } | 496 | } |
472 | 497 | ||
498 | void ttpci_budget_init_hooks(struct budget *budget) | ||
499 | { | ||
500 | if (budget->dvb_frontend && !budget->read_fe_status) { | ||
501 | budget->read_fe_status = budget->dvb_frontend->ops.read_status; | ||
502 | budget->dvb_frontend->ops.read_status = budget_read_fe_status; | ||
503 | } | ||
504 | } | ||
505 | |||
473 | int ttpci_budget_deinit(struct budget *budget) | 506 | int ttpci_budget_deinit(struct budget *budget) |
474 | { | 507 | { |
475 | struct saa7146_dev *dev = budget->dev; | 508 | struct saa7146_dev *dev = budget->dev; |
@@ -508,11 +541,8 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
508 | spin_lock(&budget->feedlock); | 541 | spin_lock(&budget->feedlock); |
509 | budget->video_port = video_port; | 542 | budget->video_port = video_port; |
510 | if (budget->feeding) { | 543 | if (budget->feeding) { |
511 | int oldfeeding = budget->feeding; | ||
512 | budget->feeding = 1; | ||
513 | stop_ts_capture(budget); | 544 | stop_ts_capture(budget); |
514 | start_ts_capture(budget); | 545 | start_ts_capture(budget); |
515 | budget->feeding = oldfeeding; | ||
516 | } | 546 | } |
517 | spin_unlock(&budget->feedlock); | 547 | spin_unlock(&budget->feedlock); |
518 | } | 548 | } |
@@ -520,6 +550,7 @@ void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port) | |||
520 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); | 550 | EXPORT_SYMBOL_GPL(ttpci_budget_debiread); |
521 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); | 551 | EXPORT_SYMBOL_GPL(ttpci_budget_debiwrite); |
522 | EXPORT_SYMBOL_GPL(ttpci_budget_init); | 552 | EXPORT_SYMBOL_GPL(ttpci_budget_init); |
553 | EXPORT_SYMBOL_GPL(ttpci_budget_init_hooks); | ||
523 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); | 554 | EXPORT_SYMBOL_GPL(ttpci_budget_deinit); |
524 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); | 555 | EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler); |
525 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); | 556 | EXPORT_SYMBOL_GPL(ttpci_budget_set_video_port); |
diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index ee60ce90a400..57227441891e 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c | |||
@@ -617,6 +617,8 @@ static int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_exte | |||
617 | budget->dvb_adapter.priv = budget; | 617 | budget->dvb_adapter.priv = budget; |
618 | frontend_init(budget); | 618 | frontend_init(budget); |
619 | 619 | ||
620 | ttpci_budget_init_hooks(budget); | ||
621 | |||
620 | return 0; | 622 | return 0; |
621 | } | 623 | } |
622 | 624 | ||
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 35761f13c12b..863dffb4ed8e 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
@@ -375,9 +375,6 @@ static void frontend_init(struct budget *budget) | |||
375 | if (budget->dvb_frontend) { | 375 | if (budget->dvb_frontend) { |
376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; | 376 | budget->dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params; |
377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; | 377 | budget->dvb_frontend->tuner_priv = &budget->i2c_adap; |
378 | budget->dvb_frontend->ops.diseqc_send_master_cmd = budget_diseqc_send_master_cmd; | ||
379 | budget->dvb_frontend->ops.diseqc_send_burst = budget_diseqc_send_burst; | ||
380 | budget->dvb_frontend->ops.set_tone = budget_set_tone; | ||
381 | break; | 378 | break; |
382 | } | 379 | } |
383 | break; | 380 | break; |
@@ -474,6 +471,8 @@ static int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_ | |||
474 | budget->dvb_adapter.priv = budget; | 471 | budget->dvb_adapter.priv = budget; |
475 | frontend_init(budget); | 472 | frontend_init(budget); |
476 | 473 | ||
474 | ttpci_budget_init_hooks(budget); | ||
475 | |||
477 | return 0; | 476 | return 0; |
478 | } | 477 | } |
479 | 478 | ||
diff --git a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h index ecea3a13030e..e8a5c79178e1 100644 --- a/drivers/media/dvb/ttpci/budget.h +++ b/drivers/media/dvb/ttpci/budget.h | |||
@@ -52,9 +52,6 @@ struct budget { | |||
52 | struct dmx_frontend hw_frontend; | 52 | struct dmx_frontend hw_frontend; |
53 | struct dmx_frontend mem_frontend; | 53 | struct dmx_frontend mem_frontend; |
54 | 54 | ||
55 | int fe_synced; | ||
56 | struct mutex pid_mutex; | ||
57 | |||
58 | int ci_present; | 55 | int ci_present; |
59 | int video_port; | 56 | int video_port; |
60 | 57 | ||
@@ -74,6 +71,9 @@ struct budget { | |||
74 | 71 | ||
75 | struct dvb_adapter dvb_adapter; | 72 | struct dvb_adapter dvb_adapter; |
76 | struct dvb_frontend *dvb_frontend; | 73 | struct dvb_frontend *dvb_frontend; |
74 | int (*read_fe_status)(struct dvb_frontend *fe, fe_status_t *status); | ||
75 | int fe_synced; | ||
76 | |||
77 | void *priv; | 77 | void *priv; |
78 | }; | 78 | }; |
79 | 79 | ||
@@ -106,6 +106,7 @@ static struct saa7146_pci_extension_data x_var = { \ | |||
106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, | 106 | extern int ttpci_budget_init(struct budget *budget, struct saa7146_dev *dev, |
107 | struct saa7146_pci_extension_data *info, | 107 | struct saa7146_pci_extension_data *info, |
108 | struct module *owner); | 108 | struct module *owner); |
109 | extern void ttpci_budget_init_hooks(struct budget *budget); | ||
109 | extern int ttpci_budget_deinit(struct budget *budget); | 110 | extern int ttpci_budget_deinit(struct budget *budget); |
110 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); | 111 | extern void ttpci_budget_irq10_handler(struct saa7146_dev *dev, u32 * isr); |
111 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); | 112 | extern void ttpci_budget_set_video_port(struct saa7146_dev *dev, int video_port); |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index 6d532f170ce5..fe56862d51e4 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -145,7 +145,7 @@ config VIDEO_SAA5246A | |||
145 | 145 | ||
146 | config VIDEO_SAA5249 | 146 | config VIDEO_SAA5249 |
147 | tristate "SAA5249 Teletext processor" | 147 | tristate "SAA5249 Teletext processor" |
148 | depends on VIDEO_DEV && I2C | 148 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
149 | help | 149 | help |
150 | Support for I2C bus based teletext using the SAA5249 chip. At the | 150 | Support for I2C bus based teletext using the SAA5249 chip. At the |
151 | moment this is only useful on some European WinTV cards. | 151 | moment this is only useful on some European WinTV cards. |
@@ -155,7 +155,7 @@ config VIDEO_SAA5249 | |||
155 | 155 | ||
156 | config TUNER_3036 | 156 | config TUNER_3036 |
157 | tristate "SAB3036 tuner" | 157 | tristate "SAB3036 tuner" |
158 | depends on VIDEO_DEV && I2C | 158 | depends on VIDEO_DEV && I2C && VIDEO_V4L1 |
159 | help | 159 | help |
160 | Say Y here to include support for Philips SAB3036 compatible tuners. | 160 | Say Y here to include support for Philips SAB3036 compatible tuners. |
161 | If in doubt, say N. | 161 | If in doubt, say N. |
diff --git a/drivers/media/video/bt8xx/Kconfig b/drivers/media/video/bt8xx/Kconfig index 153f6a4a96c9..cdcf55650714 100644 --- a/drivers/media/video/bt8xx/Kconfig +++ b/drivers/media/video/bt8xx/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_BT848 | 1 | config VIDEO_BT848 |
2 | tristate "BT848 Video For Linux" | 2 | tristate "BT848 Video For Linux" |
3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2 | 3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L1 |
4 | select I2C_ALGOBIT | 4 | select I2C_ALGOBIT |
5 | select FW_LOADER | 5 | select FW_LOADER |
6 | select VIDEO_BTCX | 6 | select VIDEO_BTCX |
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 5764a89d3562..20dff7c316eb 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
@@ -3923,7 +3923,12 @@ static int __devinit bttv_register_video(struct bttv *btv) | |||
3923 | goto err; | 3923 | goto err; |
3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", | 3924 | printk(KERN_INFO "bttv%d: registered device video%d\n", |
3925 | btv->c.nr,btv->video_dev->minor & 0x1f); | 3925 | btv->c.nr,btv->video_dev->minor & 0x1f); |
3926 | video_device_create_file(btv->video_dev, &class_device_attr_card); | 3926 | if (class_device_create_file(&btv->video_dev->class_dev, |
3927 | &class_device_attr_card)<0) { | ||
3928 | printk(KERN_ERR "bttv%d: class_device_create_file 'card' " | ||
3929 | "failed\n", btv->c.nr); | ||
3930 | goto err; | ||
3931 | } | ||
3927 | 3932 | ||
3928 | /* vbi */ | 3933 | /* vbi */ |
3929 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); | 3934 | btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); |
@@ -4287,6 +4292,8 @@ static struct pci_driver bttv_pci_driver = { | |||
4287 | 4292 | ||
4288 | static int bttv_init_module(void) | 4293 | static int bttv_init_module(void) |
4289 | { | 4294 | { |
4295 | int ret; | ||
4296 | |||
4290 | bttv_num = 0; | 4297 | bttv_num = 0; |
4291 | 4298 | ||
4292 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", | 4299 | printk(KERN_INFO "bttv: driver version %d.%d.%d loaded\n", |
@@ -4308,7 +4315,11 @@ static int bttv_init_module(void) | |||
4308 | 4315 | ||
4309 | bttv_check_chipset(); | 4316 | bttv_check_chipset(); |
4310 | 4317 | ||
4311 | bus_register(&bttv_sub_bus_type); | 4318 | ret = bus_register(&bttv_sub_bus_type); |
4319 | if (ret < 0) { | ||
4320 | printk(KERN_WARNING "bttv: bus_register error: %d\n", ret); | ||
4321 | return ret; | ||
4322 | } | ||
4312 | return pci_register_driver(&bttv_pci_driver); | 4323 | return pci_register_driver(&bttv_pci_driver); |
4313 | } | 4324 | } |
4314 | 4325 | ||
diff --git a/drivers/media/video/bt8xx/bttv-vbi.c b/drivers/media/video/bt8xx/bttv-vbi.c index 8c9f0f7cf467..63676e7bd635 100644 --- a/drivers/media/video/bt8xx/bttv-vbi.c +++ b/drivers/media/video/bt8xx/bttv-vbi.c | |||
@@ -31,11 +31,16 @@ | |||
31 | #include <asm/io.h> | 31 | #include <asm/io.h> |
32 | #include "bttvp.h" | 32 | #include "bttvp.h" |
33 | 33 | ||
34 | /* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate: | 34 | /* Offset from line sync pulse leading edge (0H) to start of VBI capture, |
35 | bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC | 35 | in fCLKx2 pixels. According to the datasheet, VBI capture starts |
36 | HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge | 36 | VBI_HDELAY fCLKx1 pixels from the tailing edgeof /HRESET, and /HRESET |
37 | of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */ | 37 | is 64 fCLKx1 pixels wide. VBI_HDELAY is set to 0, so this should be |
38 | #define VBI_OFFSET ((64 + 0) * 2) | 38 | (64 + 0) * 2 = 128 fCLKx2 pixels. But it's not! The datasheet is |
39 | Just Plain Wrong. The real value appears to be different for | ||
40 | different revisions of the bt8x8 chips, and to be affected by the | ||
41 | horizontal scaling factor. Experimentally, the value is measured | ||
42 | to be about 244. */ | ||
43 | #define VBI_OFFSET 244 | ||
39 | 44 | ||
40 | #define VBI_DEFLINES 16 | 45 | #define VBI_DEFLINES 16 |
41 | #define VBI_MAXLINES 32 | 46 | #define VBI_MAXLINES 32 |
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c index 353d02b67c33..9dddff42ec13 100644 --- a/drivers/media/video/compat_ioctl32.c +++ b/drivers/media/video/compat_ioctl32.c | |||
@@ -490,6 +490,23 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
490 | return 0; | 490 | return 0; |
491 | } | 491 | } |
492 | 492 | ||
493 | struct video_code32 | ||
494 | { | ||
495 | char loadwhat[16]; /* name or tag of file being passed */ | ||
496 | compat_int_t datasize; | ||
497 | unsigned char *data; | ||
498 | }; | ||
499 | |||
500 | static inline int microcode32(struct video_code *kp, struct video_code32 __user *up) | ||
501 | { | ||
502 | if(!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || | ||
503 | copy_from_user(kp->loadwhat, up->loadwhat, sizeof (up->loadwhat)) || | ||
504 | get_user(kp->datasize, &up->datasize) || | ||
505 | copy_from_user(kp->data, up->data, up->datasize)) | ||
506 | return -EFAULT; | ||
507 | return 0; | ||
508 | } | ||
509 | |||
493 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) | 510 | #define VIDIOCGTUNER32 _IOWR('v',4, struct video_tuner32) |
494 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) | 511 | #define VIDIOCSTUNER32 _IOW('v',5, struct video_tuner32) |
495 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) | 512 | #define VIDIOCGWIN32 _IOR('v',9, struct video_window32) |
@@ -498,6 +515,7 @@ static inline int put_v4l2_input(struct v4l2_input *kp, struct v4l2_input __user | |||
498 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) | 515 | #define VIDIOCSFBUF32 _IOW('v',12, struct video_buffer32) |
499 | #define VIDIOCGFREQ32 _IOR('v',14, u32) | 516 | #define VIDIOCGFREQ32 _IOR('v',14, u32) |
500 | #define VIDIOCSFREQ32 _IOW('v',15, u32) | 517 | #define VIDIOCSFREQ32 _IOW('v',15, u32) |
518 | #define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32) | ||
501 | 519 | ||
502 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ | 520 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ |
503 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) | 521 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) |
@@ -590,6 +608,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
590 | struct video_tuner vt; | 608 | struct video_tuner vt; |
591 | struct video_buffer vb; | 609 | struct video_buffer vb; |
592 | struct video_window vw; | 610 | struct video_window vw; |
611 | struct video_code vc; | ||
593 | struct v4l2_format v2f; | 612 | struct v4l2_format v2f; |
594 | struct v4l2_buffer v2b; | 613 | struct v4l2_buffer v2b; |
595 | struct v4l2_framebuffer v2fb; | 614 | struct v4l2_framebuffer v2fb; |
@@ -628,6 +647,7 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
628 | case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; | 647 | case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; |
629 | case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; | 648 | case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; |
630 | case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; | 649 | case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; |
650 | case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; | ||
631 | }; | 651 | }; |
632 | 652 | ||
633 | switch(cmd) { | 653 | switch(cmd) { |
@@ -703,6 +723,10 @@ static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg | |||
703 | case VIDIOC_G_FBUF: | 723 | case VIDIOC_G_FBUF: |
704 | case VIDIOC_G_INPUT: | 724 | case VIDIOC_G_INPUT: |
705 | compatible_arg = 0; | 725 | compatible_arg = 0; |
726 | case VIDIOCSMICROCODE: | ||
727 | err = microcode32(&karg.vc, up); | ||
728 | compatible_arg = 0; | ||
729 | break; | ||
706 | }; | 730 | }; |
707 | 731 | ||
708 | if(err) | 732 | if(err) |
diff --git a/drivers/media/video/cpia2/Kconfig b/drivers/media/video/cpia2/Kconfig index 513cc0927389..e39a96152004 100644 --- a/drivers/media/video/cpia2/Kconfig +++ b/drivers/media/video/cpia2/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config VIDEO_CPIA2 | 1 | config VIDEO_CPIA2 |
2 | tristate "CPiA2 Video For Linux" | 2 | tristate "CPiA2 Video For Linux" |
3 | depends on VIDEO_DEV && USB | 3 | depends on VIDEO_DEV && USB && VIDEO_V4L1 |
4 | ---help--- | 4 | ---help--- |
5 | This is the video4linux driver for cameras based on Vision's CPiA2 | 5 | This is the video4linux driver for cameras based on Vision's CPiA2 |
6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 | 6 | (Colour Processor Interface ASIC), such as the Digital Blue QX5 |
diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c index 72b630a91f41..c25564648993 100644 --- a/drivers/media/video/cx88/cx88-input.c +++ b/drivers/media/video/cx88/cx88-input.c | |||
@@ -89,7 +89,7 @@ static void cx88_ir_handle_key(struct cx88_IR *ir) | |||
89 | 89 | ||
90 | auxgpio = cx_read(MO_GP1_IO); | 90 | auxgpio = cx_read(MO_GP1_IO); |
91 | /* Take out the parity part */ | 91 | /* Take out the parity part */ |
92 | gpio+=(gpio & 0x7fd) + (auxgpio & 0xef); | 92 | gpio=(gpio & 0x7fd) + (auxgpio & 0xef); |
93 | } else | 93 | } else |
94 | auxgpio = gpio; | 94 | auxgpio = gpio; |
95 | 95 | ||
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 2225d4b94140..547cdbdb644d 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
@@ -1180,7 +1180,6 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1180 | V4L2_CAP_READWRITE | | 1180 | V4L2_CAP_READWRITE | |
1181 | V4L2_CAP_STREAMING | | 1181 | V4L2_CAP_STREAMING | |
1182 | V4L2_CAP_VBI_CAPTURE | | 1182 | V4L2_CAP_VBI_CAPTURE | |
1183 | V4L2_CAP_VIDEO_OVERLAY | | ||
1184 | 0; | 1183 | 0; |
1185 | if (UNSET != core->tuner_type) | 1184 | if (UNSET != core->tuner_type) |
1186 | cap->capabilities |= V4L2_CAP_TUNER; | 1185 | cap->capabilities |= V4L2_CAP_TUNER; |
@@ -1226,7 +1225,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
1226 | struct v4l2_format *f = arg; | 1225 | struct v4l2_format *f = arg; |
1227 | return cx8800_try_fmt(dev,fh,f); | 1226 | return cx8800_try_fmt(dev,fh,f); |
1228 | } | 1227 | } |
1229 | #ifdef HAVE_V4L1 | 1228 | #ifdef CONFIG_V4L1_COMPAT |
1230 | /* --- streaming capture ------------------------------------- */ | 1229 | /* --- streaming capture ------------------------------------- */ |
1231 | case VIDIOCGMBUF: | 1230 | case VIDIOCGMBUF: |
1232 | { | 1231 | { |
@@ -1585,7 +1584,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file, | |||
1585 | *id = 0; | 1584 | *id = 0; |
1586 | return 0; | 1585 | return 0; |
1587 | } | 1586 | } |
1588 | #ifdef HAVE_V4L1 | 1587 | #ifdef CONFIG_V4L1_COMPAT |
1589 | case VIDIOCSTUNER: | 1588 | case VIDIOCSTUNER: |
1590 | { | 1589 | { |
1591 | struct video_tuner *v = arg; | 1590 | struct video_tuner *v = arg; |
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index dbb75a7db199..56246b8578f3 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
@@ -362,7 +362,7 @@ int msp_sleep(struct msp_state *state, int timeout) | |||
362 | } | 362 | } |
363 | 363 | ||
364 | /* ------------------------------------------------------------------------ */ | 364 | /* ------------------------------------------------------------------------ */ |
365 | 365 | #ifdef CONFIG_VIDEO_V4L1 | |
366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) | 366 | static int msp_mode_v4l2_to_v4l1(int rxsubchans, int audmode) |
367 | { | 367 | { |
368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) | 368 | if (rxsubchans == V4L2_TUNER_SUB_MONO) |
@@ -384,6 +384,7 @@ static int msp_mode_v4l1_to_v4l2(int mode) | |||
384 | return V4L2_TUNER_MODE_LANG1; | 384 | return V4L2_TUNER_MODE_LANG1; |
385 | return V4L2_TUNER_MODE_MONO; | 385 | return V4L2_TUNER_MODE_MONO; |
386 | } | 386 | } |
387 | #endif | ||
387 | 388 | ||
388 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) | 389 | static int msp_get_ctrl(struct i2c_client *client, struct v4l2_control *ctrl) |
389 | { | 390 | { |
@@ -509,6 +510,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
509 | /* --- v4l ioctls --- */ | 510 | /* --- v4l ioctls --- */ |
510 | /* take care: bttv does userspace copying, we'll get a | 511 | /* take care: bttv does userspace copying, we'll get a |
511 | kernel pointer here... */ | 512 | kernel pointer here... */ |
513 | #ifdef CONFIG_VIDEO_V4L1 | ||
512 | case VIDIOCGAUDIO: | 514 | case VIDIOCGAUDIO: |
513 | { | 515 | { |
514 | struct video_audio *va = arg; | 516 | struct video_audio *va = arg; |
@@ -577,6 +579,12 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
577 | } | 579 | } |
578 | 580 | ||
579 | case VIDIOCSFREQ: | 581 | case VIDIOCSFREQ: |
582 | { | ||
583 | /* new channel -- kick audio carrier scan */ | ||
584 | msp_wake_thread(client); | ||
585 | break; | ||
586 | } | ||
587 | #endif | ||
580 | case VIDIOC_S_FREQUENCY: | 588 | case VIDIOC_S_FREQUENCY: |
581 | { | 589 | { |
582 | /* new channel -- kick audio carrier scan */ | 590 | /* new channel -- kick audio carrier scan */ |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 9b48abcf6089..be1e5cc78081 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -852,7 +852,6 @@ unsigned long pvr2_hdw_get_sn(struct pvr2_hdw *hdw) | |||
852 | return hdw->serial_number; | 852 | return hdw->serial_number; |
853 | } | 853 | } |
854 | 854 | ||
855 | |||
856 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) | 855 | int pvr2_hdw_get_unit_number(struct pvr2_hdw *hdw) |
857 | { | 856 | { |
858 | return hdw->unit_number; | 857 | return hdw->unit_number; |
@@ -2318,7 +2317,6 @@ void pvr2_hdw_poll_trigger_unlocked(struct pvr2_hdw *hdw) | |||
2318 | } | 2317 | } |
2319 | } | 2318 | } |
2320 | 2319 | ||
2321 | |||
2322 | /* Return name for this driver instance */ | 2320 | /* Return name for this driver instance */ |
2323 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) | 2321 | const char *pvr2_hdw_get_driver_name(struct pvr2_hdw *hdw) |
2324 | { | 2322 | { |
@@ -2542,6 +2540,10 @@ static void pvr2_ctl_timeout(unsigned long data) | |||
2542 | } | 2540 | } |
2543 | 2541 | ||
2544 | 2542 | ||
2543 | /* Issue a command and get a response from the device. This extended | ||
2544 | version includes a probe flag (which if set means that device errors | ||
2545 | should not be logged or treated as fatal) and a timeout in jiffies. | ||
2546 | This can be used to non-lethally probe the health of endpoint 1. */ | ||
2545 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, | 2547 | static int pvr2_send_request_ex(struct pvr2_hdw *hdw, |
2546 | unsigned int timeout,int probe_fl, | 2548 | unsigned int timeout,int probe_fl, |
2547 | void *write_data,unsigned int write_len, | 2549 | void *write_data,unsigned int write_len, |
@@ -2970,6 +2972,7 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) | |||
2970 | } | 2972 | } |
2971 | 2973 | ||
2972 | 2974 | ||
2975 | /* Stop / start video stream transport */ | ||
2973 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) | 2976 | static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl) |
2974 | { | 2977 | { |
2975 | int status; | 2978 | int status; |
@@ -3068,6 +3071,7 @@ int pvr2_hdw_gpio_chg_out(struct pvr2_hdw *hdw,u32 msk,u32 val) | |||
3068 | } | 3071 | } |
3069 | 3072 | ||
3070 | 3073 | ||
3074 | /* Find I2C address of eeprom */ | ||
3071 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) | 3075 | static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) |
3072 | { | 3076 | { |
3073 | int result; | 3077 | int result; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.c b/drivers/media/video/pvrusb2/pvrusb2-io.c index 681f79c8064e..1e393762546c 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.c +++ b/drivers/media/video/pvrusb2/pvrusb2-io.c | |||
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
28 | 28 | ||
29 | static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state); | ||
30 | |||
29 | #define BUFFER_SIG 0x47653271 | 31 | #define BUFFER_SIG 0x47653271 |
30 | 32 | ||
31 | // #define SANITY_CHECK_BUFFERS | 33 | // #define SANITY_CHECK_BUFFERS |
@@ -515,6 +517,10 @@ void pvr2_stream_set_callback(struct pvr2_stream *sp, | |||
515 | } | 517 | } |
516 | 518 | ||
517 | /* Query / set the nominal buffer count */ | 519 | /* Query / set the nominal buffer count */ |
520 | int pvr2_stream_get_buffer_count(struct pvr2_stream *sp) | ||
521 | { | ||
522 | return sp->buffer_target_count; | ||
523 | } | ||
518 | 524 | ||
519 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) | 525 | int pvr2_stream_set_buffer_count(struct pvr2_stream *sp,unsigned int cnt) |
520 | { | 526 | { |
@@ -553,7 +559,6 @@ int pvr2_stream_get_ready_count(struct pvr2_stream *sp) | |||
553 | return sp->r_count; | 559 | return sp->r_count; |
554 | } | 560 | } |
555 | 561 | ||
556 | |||
557 | void pvr2_stream_kill(struct pvr2_stream *sp) | 562 | void pvr2_stream_kill(struct pvr2_stream *sp) |
558 | { | 563 | { |
559 | struct pvr2_buffer *bp; | 564 | struct pvr2_buffer *bp; |
@@ -607,7 +612,6 @@ int pvr2_buffer_queue(struct pvr2_buffer *bp) | |||
607 | return ret; | 612 | return ret; |
608 | } | 613 | } |
609 | 614 | ||
610 | |||
611 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) | 615 | int pvr2_buffer_set_buffer(struct pvr2_buffer *bp,void *ptr,unsigned int cnt) |
612 | { | 616 | { |
613 | int ret = 0; | 617 | int ret = 0; |
@@ -646,7 +650,6 @@ int pvr2_buffer_get_status(struct pvr2_buffer *bp) | |||
646 | return bp->status; | 650 | return bp->status; |
647 | } | 651 | } |
648 | 652 | ||
649 | |||
650 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) | 653 | int pvr2_buffer_get_id(struct pvr2_buffer *bp) |
651 | { | 654 | { |
652 | return bp->id; | 655 | return bp->id; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-io.h b/drivers/media/video/pvrusb2/pvrusb2-io.h index 96285ad234a6..93279cc2a35e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-io.h +++ b/drivers/media/video/pvrusb2/pvrusb2-io.h | |||
@@ -47,6 +47,7 @@ void pvr2_stream_set_callback(struct pvr2_stream *, | |||
47 | void *data); | 47 | void *data); |
48 | 48 | ||
49 | /* Query / set the nominal buffer count */ | 49 | /* Query / set the nominal buffer count */ |
50 | int pvr2_stream_get_buffer_count(struct pvr2_stream *); | ||
50 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); | 51 | int pvr2_stream_set_buffer_count(struct pvr2_stream *,unsigned int); |
51 | 52 | ||
52 | /* Get a pointer to a buffer that is either idle, ready, or is specified | 53 | /* Get a pointer to a buffer that is either idle, ready, or is specified |
@@ -58,6 +59,7 @@ struct pvr2_buffer *pvr2_stream_get_buffer(struct pvr2_stream *sp,int id); | |||
58 | /* Find out how many buffers are idle or ready */ | 59 | /* Find out how many buffers are idle or ready */ |
59 | int pvr2_stream_get_ready_count(struct pvr2_stream *); | 60 | int pvr2_stream_get_ready_count(struct pvr2_stream *); |
60 | 61 | ||
62 | |||
61 | /* Kill all pending buffers and throw away any ready buffers as well */ | 63 | /* Kill all pending buffers and throw away any ready buffers as well */ |
62 | void pvr2_stream_kill(struct pvr2_stream *); | 64 | void pvr2_stream_kill(struct pvr2_stream *); |
63 | 65 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-ioread.c b/drivers/media/video/pvrusb2/pvrusb2-ioread.c index f7a2e225a002..b71f9a961f8a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-ioread.c +++ b/drivers/media/video/pvrusb2/pvrusb2-ioread.c | |||
@@ -213,7 +213,9 @@ int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp) | |||
213 | " pvr2_ioread_setup (tear-down) id=%p",cp); | 213 | " pvr2_ioread_setup (tear-down) id=%p",cp); |
214 | pvr2_ioread_stop(cp); | 214 | pvr2_ioread_stop(cp); |
215 | pvr2_stream_kill(cp->stream); | 215 | pvr2_stream_kill(cp->stream); |
216 | pvr2_stream_set_buffer_count(cp->stream,0); | 216 | if (pvr2_stream_get_buffer_count(cp->stream)) { |
217 | pvr2_stream_set_buffer_count(cp->stream,0); | ||
218 | } | ||
217 | cp->stream = NULL; | 219 | cp->stream = NULL; |
218 | } | 220 | } |
219 | if (sp) { | 221 | if (sp) { |
@@ -251,7 +253,6 @@ int pvr2_ioread_set_enabled(struct pvr2_ioread *cp,int fl) | |||
251 | return ret; | 253 | return ret; |
252 | } | 254 | } |
253 | 255 | ||
254 | |||
255 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) | 256 | static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) |
256 | { | 257 | { |
257 | int stat; | 258 | int stat; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c index 6af55a8b6f05..d1dda5caf406 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-sysfs.c +++ b/drivers/media/video/pvrusb2/pvrusb2-sysfs.c | |||
@@ -44,12 +44,16 @@ struct pvr2_sysfs { | |||
44 | struct kobj_type ktype; | 44 | struct kobj_type ktype; |
45 | struct class_device_attribute attr_v4l_minor_number; | 45 | struct class_device_attribute attr_v4l_minor_number; |
46 | struct class_device_attribute attr_unit_number; | 46 | struct class_device_attribute attr_unit_number; |
47 | int v4l_minor_number_created_ok; | ||
48 | int unit_number_created_ok; | ||
47 | }; | 49 | }; |
48 | 50 | ||
49 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 51 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
50 | struct pvr2_sysfs_debugifc { | 52 | struct pvr2_sysfs_debugifc { |
51 | struct class_device_attribute attr_debugcmd; | 53 | struct class_device_attribute attr_debugcmd; |
52 | struct class_device_attribute attr_debuginfo; | 54 | struct class_device_attribute attr_debuginfo; |
55 | int debugcmd_created_ok; | ||
56 | int debuginfo_created_ok; | ||
53 | }; | 57 | }; |
54 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 58 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
55 | 59 | ||
@@ -67,6 +71,7 @@ struct pvr2_sysfs_ctl_item { | |||
67 | struct pvr2_sysfs_ctl_item *item_next; | 71 | struct pvr2_sysfs_ctl_item *item_next; |
68 | struct attribute *attr_gen[7]; | 72 | struct attribute *attr_gen[7]; |
69 | struct attribute_group grp; | 73 | struct attribute_group grp; |
74 | int created_ok; | ||
70 | char name[80]; | 75 | char name[80]; |
71 | }; | 76 | }; |
72 | 77 | ||
@@ -487,6 +492,7 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
487 | struct pvr2_sysfs_func_set *fp; | 492 | struct pvr2_sysfs_func_set *fp; |
488 | struct pvr2_ctrl *cptr; | 493 | struct pvr2_ctrl *cptr; |
489 | unsigned int cnt,acnt; | 494 | unsigned int cnt,acnt; |
495 | int ret; | ||
490 | 496 | ||
491 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { | 497 | if ((ctl_id < 0) || (ctl_id >= (sizeof(funcs)/sizeof(funcs[0])))) { |
492 | return; | 498 | return; |
@@ -589,7 +595,13 @@ static void pvr2_sysfs_add_control(struct pvr2_sysfs *sfp,int ctl_id) | |||
589 | cip->grp.name = cip->name; | 595 | cip->grp.name = cip->name; |
590 | cip->grp.attrs = cip->attr_gen; | 596 | cip->grp.attrs = cip->attr_gen; |
591 | 597 | ||
592 | sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); | 598 | ret = sysfs_create_group(&sfp->class_dev->kobj,&cip->grp); |
599 | if (ret) { | ||
600 | printk(KERN_WARNING "%s: sysfs_create_group error: %d\n", | ||
601 | __FUNCTION__, ret); | ||
602 | return; | ||
603 | } | ||
604 | cip->created_ok = !0; | ||
593 | } | 605 | } |
594 | 606 | ||
595 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 607 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
@@ -600,6 +612,8 @@ static ssize_t debugcmd_store(struct class_device *,const char *,size_t count); | |||
600 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | 612 | static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) |
601 | { | 613 | { |
602 | struct pvr2_sysfs_debugifc *dip; | 614 | struct pvr2_sysfs_debugifc *dip; |
615 | int ret; | ||
616 | |||
603 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); | 617 | dip = kmalloc(sizeof(*dip),GFP_KERNEL); |
604 | if (!dip) return; | 618 | if (!dip) return; |
605 | memset(dip,0,sizeof(*dip)); | 619 | memset(dip,0,sizeof(*dip)); |
@@ -613,17 +627,34 @@ static void pvr2_sysfs_add_debugifc(struct pvr2_sysfs *sfp) | |||
613 | dip->attr_debuginfo.attr.mode = S_IRUGO; | 627 | dip->attr_debuginfo.attr.mode = S_IRUGO; |
614 | dip->attr_debuginfo.show = debuginfo_show; | 628 | dip->attr_debuginfo.show = debuginfo_show; |
615 | sfp->debugifc = dip; | 629 | sfp->debugifc = dip; |
616 | class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); | 630 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debugcmd); |
617 | class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | 631 | if (ret < 0) { |
632 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
633 | __FUNCTION__, ret); | ||
634 | } else { | ||
635 | dip->debugcmd_created_ok = !0; | ||
636 | } | ||
637 | ret = class_device_create_file(sfp->class_dev,&dip->attr_debuginfo); | ||
638 | if (ret < 0) { | ||
639 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
640 | __FUNCTION__, ret); | ||
641 | } else { | ||
642 | dip->debuginfo_created_ok = !0; | ||
643 | } | ||
618 | } | 644 | } |
619 | 645 | ||
620 | 646 | ||
621 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) | 647 | static void pvr2_sysfs_tear_down_debugifc(struct pvr2_sysfs *sfp) |
622 | { | 648 | { |
623 | if (!sfp->debugifc) return; | 649 | if (!sfp->debugifc) return; |
624 | class_device_remove_file(sfp->class_dev, | 650 | if (sfp->debugifc->debuginfo_created_ok) { |
625 | &sfp->debugifc->attr_debuginfo); | 651 | class_device_remove_file(sfp->class_dev, |
626 | class_device_remove_file(sfp->class_dev,&sfp->debugifc->attr_debugcmd); | 652 | &sfp->debugifc->attr_debuginfo); |
653 | } | ||
654 | if (sfp->debugifc->debugcmd_created_ok) { | ||
655 | class_device_remove_file(sfp->class_dev, | ||
656 | &sfp->debugifc->attr_debugcmd); | ||
657 | } | ||
627 | kfree(sfp->debugifc); | 658 | kfree(sfp->debugifc); |
628 | sfp->debugifc = NULL; | 659 | sfp->debugifc = NULL; |
629 | } | 660 | } |
@@ -645,7 +676,9 @@ static void pvr2_sysfs_tear_down_controls(struct pvr2_sysfs *sfp) | |||
645 | struct pvr2_sysfs_ctl_item *cip1,*cip2; | 676 | struct pvr2_sysfs_ctl_item *cip1,*cip2; |
646 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { | 677 | for (cip1 = sfp->item_first; cip1; cip1 = cip2) { |
647 | cip2 = cip1->item_next; | 678 | cip2 = cip1->item_next; |
648 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | 679 | if (cip1->created_ok) { |
680 | sysfs_remove_group(&sfp->class_dev->kobj,&cip1->grp); | ||
681 | } | ||
649 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); | 682 | pvr2_sysfs_trace("Destroying pvr2_sysfs_ctl_item id=%p",cip1); |
650 | kfree(cip1); | 683 | kfree(cip1); |
651 | } | 684 | } |
@@ -675,8 +708,14 @@ static void class_dev_destroy(struct pvr2_sysfs *sfp) | |||
675 | pvr2_sysfs_tear_down_debugifc(sfp); | 708 | pvr2_sysfs_tear_down_debugifc(sfp); |
676 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ | 709 | #endif /* CONFIG_VIDEO_PVRUSB2_DEBUGIFC */ |
677 | pvr2_sysfs_tear_down_controls(sfp); | 710 | pvr2_sysfs_tear_down_controls(sfp); |
678 | class_device_remove_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 711 | if (sfp->v4l_minor_number_created_ok) { |
679 | class_device_remove_file(sfp->class_dev,&sfp->attr_unit_number); | 712 | class_device_remove_file(sfp->class_dev, |
713 | &sfp->attr_v4l_minor_number); | ||
714 | } | ||
715 | if (sfp->unit_number_created_ok) { | ||
716 | class_device_remove_file(sfp->class_dev, | ||
717 | &sfp->attr_unit_number); | ||
718 | } | ||
680 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); | 719 | pvr2_sysfs_trace("Destroying class_dev id=%p",sfp->class_dev); |
681 | sfp->class_dev->class_data = NULL; | 720 | sfp->class_dev->class_data = NULL; |
682 | class_device_unregister(sfp->class_dev); | 721 | class_device_unregister(sfp->class_dev); |
@@ -709,6 +748,8 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
709 | { | 748 | { |
710 | struct usb_device *usb_dev; | 749 | struct usb_device *usb_dev; |
711 | struct class_device *class_dev; | 750 | struct class_device *class_dev; |
751 | int ret; | ||
752 | |||
712 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); | 753 | usb_dev = pvr2_hdw_get_dev(sfp->channel.hdw); |
713 | if (!usb_dev) return; | 754 | if (!usb_dev) return; |
714 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); | 755 | class_dev = kmalloc(sizeof(*class_dev),GFP_KERNEL); |
@@ -733,20 +774,40 @@ static void class_dev_create(struct pvr2_sysfs *sfp, | |||
733 | 774 | ||
734 | sfp->class_dev = class_dev; | 775 | sfp->class_dev = class_dev; |
735 | class_dev->class_data = sfp; | 776 | class_dev->class_data = sfp; |
736 | class_device_register(class_dev); | 777 | ret = class_device_register(class_dev); |
778 | if (ret) { | ||
779 | printk(KERN_ERR "%s: class_device_register failed\n", | ||
780 | __FUNCTION__); | ||
781 | kfree(class_dev); | ||
782 | return; | ||
783 | } | ||
737 | 784 | ||
738 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; | 785 | sfp->attr_v4l_minor_number.attr.owner = THIS_MODULE; |
739 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; | 786 | sfp->attr_v4l_minor_number.attr.name = "v4l_minor_number"; |
740 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; | 787 | sfp->attr_v4l_minor_number.attr.mode = S_IRUGO; |
741 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; | 788 | sfp->attr_v4l_minor_number.show = v4l_minor_number_show; |
742 | sfp->attr_v4l_minor_number.store = NULL; | 789 | sfp->attr_v4l_minor_number.store = NULL; |
743 | class_device_create_file(sfp->class_dev,&sfp->attr_v4l_minor_number); | 790 | ret = class_device_create_file(sfp->class_dev, |
791 | &sfp->attr_v4l_minor_number); | ||
792 | if (ret < 0) { | ||
793 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
794 | __FUNCTION__, ret); | ||
795 | } else { | ||
796 | sfp->v4l_minor_number_created_ok = !0; | ||
797 | } | ||
798 | |||
744 | sfp->attr_unit_number.attr.owner = THIS_MODULE; | 799 | sfp->attr_unit_number.attr.owner = THIS_MODULE; |
745 | sfp->attr_unit_number.attr.name = "unit_number"; | 800 | sfp->attr_unit_number.attr.name = "unit_number"; |
746 | sfp->attr_unit_number.attr.mode = S_IRUGO; | 801 | sfp->attr_unit_number.attr.mode = S_IRUGO; |
747 | sfp->attr_unit_number.show = unit_number_show; | 802 | sfp->attr_unit_number.show = unit_number_show; |
748 | sfp->attr_unit_number.store = NULL; | 803 | sfp->attr_unit_number.store = NULL; |
749 | class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); | 804 | ret = class_device_create_file(sfp->class_dev,&sfp->attr_unit_number); |
805 | if (ret < 0) { | ||
806 | printk(KERN_WARNING "%s: class_device_create_file error: %d\n", | ||
807 | __FUNCTION__, ret); | ||
808 | } else { | ||
809 | sfp->unit_number_created_ok = !0; | ||
810 | } | ||
750 | 811 | ||
751 | pvr2_sysfs_add_controls(sfp); | 812 | pvr2_sysfs_add_controls(sfp); |
752 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC | 813 | #ifdef CONFIG_VIDEO_PVRUSB2_DEBUGIFC |
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index f1fd69e7f119..d73cff1970ae 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c | |||
@@ -997,9 +997,9 @@ static int saa7134_alsa_init(void) | |||
997 | struct saa7134_dev *dev = NULL; | 997 | struct saa7134_dev *dev = NULL; |
998 | struct list_head *list; | 998 | struct list_head *list; |
999 | 999 | ||
1000 | if (!dmasound_init && !dmasound_exit) { | 1000 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
1001 | dmasound_init = alsa_device_init; | 1001 | saa7134_dmasound_init = alsa_device_init; |
1002 | dmasound_exit = alsa_device_exit; | 1002 | saa7134_dmasound_exit = alsa_device_exit; |
1003 | } else { | 1003 | } else { |
1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); | 1004 | printk(KERN_WARNING "saa7134 ALSA: can't load, DMA sound handler already assigned (probably to OSS)\n"); |
1005 | return -EBUSY; | 1005 | return -EBUSY; |
@@ -1036,8 +1036,8 @@ static void saa7134_alsa_exit(void) | |||
1036 | snd_card_free(snd_saa7134_cards[idx]); | 1036 | snd_card_free(snd_saa7134_cards[idx]); |
1037 | } | 1037 | } |
1038 | 1038 | ||
1039 | dmasound_init = NULL; | 1039 | saa7134_dmasound_init = NULL; |
1040 | dmasound_exit = NULL; | 1040 | saa7134_dmasound_exit = NULL; |
1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); | 1041 | printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); |
1042 | 1042 | ||
1043 | return; | 1043 | return; |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 6e97cc84ba89..be3a81fc90a2 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -95,8 +95,8 @@ LIST_HEAD(saa7134_devlist); | |||
95 | static LIST_HEAD(mops_list); | 95 | static LIST_HEAD(mops_list); |
96 | static unsigned int saa7134_devcount; | 96 | static unsigned int saa7134_devcount; |
97 | 97 | ||
98 | int (*dmasound_init)(struct saa7134_dev *dev); | 98 | int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
99 | int (*dmasound_exit)(struct saa7134_dev *dev); | 99 | int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
100 | 100 | ||
101 | #define dprintk(fmt, arg...) if (core_debug) \ | 101 | #define dprintk(fmt, arg...) if (core_debug) \ |
102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) | 102 | printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg) |
@@ -1008,8 +1008,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1008 | /* check for signal */ | 1008 | /* check for signal */ |
1009 | saa7134_irq_video_intl(dev); | 1009 | saa7134_irq_video_intl(dev); |
1010 | 1010 | ||
1011 | if (dmasound_init && !dev->dmasound.priv_data) { | 1011 | if (saa7134_dmasound_init && !dev->dmasound.priv_data) { |
1012 | dmasound_init(dev); | 1012 | saa7134_dmasound_init(dev); |
1013 | } | 1013 | } |
1014 | 1014 | ||
1015 | return 0; | 1015 | return 0; |
@@ -1036,8 +1036,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev) | |||
1036 | struct saa7134_mpeg_ops *mops; | 1036 | struct saa7134_mpeg_ops *mops; |
1037 | 1037 | ||
1038 | /* Release DMA sound modules if present */ | 1038 | /* Release DMA sound modules if present */ |
1039 | if (dmasound_exit && dev->dmasound.priv_data) { | 1039 | if (saa7134_dmasound_exit && dev->dmasound.priv_data) { |
1040 | dmasound_exit(dev); | 1040 | saa7134_dmasound_exit(dev); |
1041 | } | 1041 | } |
1042 | 1042 | ||
1043 | /* debugging ... */ | 1043 | /* debugging ... */ |
@@ -1169,8 +1169,8 @@ EXPORT_SYMBOL(saa7134_boards); | |||
1169 | 1169 | ||
1170 | /* ----------------- for the DMA sound modules --------------- */ | 1170 | /* ----------------- for the DMA sound modules --------------- */ |
1171 | 1171 | ||
1172 | EXPORT_SYMBOL(dmasound_init); | 1172 | EXPORT_SYMBOL(saa7134_dmasound_init); |
1173 | EXPORT_SYMBOL(dmasound_exit); | 1173 | EXPORT_SYMBOL(saa7134_dmasound_exit); |
1174 | EXPORT_SYMBOL(saa7134_pgtable_free); | 1174 | EXPORT_SYMBOL(saa7134_pgtable_free); |
1175 | EXPORT_SYMBOL(saa7134_pgtable_build); | 1175 | EXPORT_SYMBOL(saa7134_pgtable_build); |
1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); | 1176 | EXPORT_SYMBOL(saa7134_pgtable_alloc); |
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c index 3895d05804ae..2e3ba5f31453 100644 --- a/drivers/media/video/saa7134/saa7134-oss.c +++ b/drivers/media/video/saa7134/saa7134-oss.c | |||
@@ -993,9 +993,9 @@ static int saa7134_oss_init(void) | |||
993 | struct saa7134_dev *dev = NULL; | 993 | struct saa7134_dev *dev = NULL; |
994 | struct list_head *list; | 994 | struct list_head *list; |
995 | 995 | ||
996 | if (!dmasound_init && !dmasound_exit) { | 996 | if (!saa7134_dmasound_init && !saa7134_dmasound_exit) { |
997 | dmasound_init = oss_device_init; | 997 | saa7134_dmasound_init = oss_device_init; |
998 | dmasound_exit = oss_device_exit; | 998 | saa7134_dmasound_exit = oss_device_exit; |
999 | } else { | 999 | } else { |
1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); | 1000 | printk(KERN_WARNING "saa7134 OSS: can't load, DMA sound handler already assigned (probably to ALSA)\n"); |
1001 | return -EBUSY; | 1001 | return -EBUSY; |
@@ -1037,8 +1037,8 @@ static void saa7134_oss_exit(void) | |||
1037 | 1037 | ||
1038 | } | 1038 | } |
1039 | 1039 | ||
1040 | dmasound_init = NULL; | 1040 | saa7134_dmasound_init = NULL; |
1041 | dmasound_exit = NULL; | 1041 | saa7134_dmasound_exit = NULL; |
1042 | 1042 | ||
1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); | 1043 | printk(KERN_INFO "saa7134 OSS driver for DMA sound unloaded\n"); |
1044 | 1044 | ||
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index e4156ec9c6d7..8656f2400e18 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -40,7 +40,7 @@ | |||
40 | 40 | ||
41 | static unsigned int video_debug = 0; | 41 | static unsigned int video_debug = 0; |
42 | static unsigned int gbuffers = 8; | 42 | static unsigned int gbuffers = 8; |
43 | static unsigned int noninterlaced = 0; | 43 | static unsigned int noninterlaced = 1; |
44 | static unsigned int gbufsize = 720*576*4; | 44 | static unsigned int gbufsize = 720*576*4; |
45 | static unsigned int gbufsize_max = 720*576*4; | 45 | static unsigned int gbufsize_max = 720*576*4; |
46 | module_param(video_debug, int, 0644); | 46 | module_param(video_debug, int, 0644); |
@@ -48,7 +48,7 @@ MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); | |||
48 | module_param(gbuffers, int, 0444); | 48 | module_param(gbuffers, int, 0444); |
49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); | 49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); |
50 | module_param(noninterlaced, int, 0644); | 50 | module_param(noninterlaced, int, 0644); |
51 | MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced"); | 51 | MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); |
52 | 52 | ||
53 | #define dprintk(fmt, arg...) if (video_debug) \ | 53 | #define dprintk(fmt, arg...) if (video_debug) \ |
54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
@@ -2087,7 +2087,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
2087 | struct v4l2_format *f = arg; | 2087 | struct v4l2_format *f = arg; |
2088 | return saa7134_try_fmt(dev,fh,f); | 2088 | return saa7134_try_fmt(dev,fh,f); |
2089 | } | 2089 | } |
2090 | #ifdef HAVE_V4L1 | 2090 | #ifdef CONFIG_V4L1_COMPAT |
2091 | case VIDIOCGMBUF: | 2091 | case VIDIOCGMBUF: |
2092 | { | 2092 | { |
2093 | struct video_mbuf *mbuf = arg; | 2093 | struct video_mbuf *mbuf = arg; |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index d5ee99c574cc..c04ce6152fd5 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
@@ -586,8 +586,8 @@ void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf); | |||
586 | 586 | ||
587 | int saa7134_set_dmabits(struct saa7134_dev *dev); | 587 | int saa7134_set_dmabits(struct saa7134_dev *dev); |
588 | 588 | ||
589 | extern int (*dmasound_init)(struct saa7134_dev *dev); | 589 | extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev); |
590 | extern int (*dmasound_exit)(struct saa7134_dev *dev); | 590 | extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev); |
591 | 591 | ||
592 | 592 | ||
593 | /* ----------------------------------------------------------- */ | 593 | /* ----------------------------------------------------------- */ |
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c index b36ba9fa3a28..5686547ba76a 100644 --- a/drivers/media/video/stradis.c +++ b/drivers/media/video/stradis.c | |||
@@ -2181,7 +2181,6 @@ static struct pci_device_id stradis_pci_tbl[] = { | |||
2181 | { 0 } | 2181 | { 0 } |
2182 | }; | 2182 | }; |
2183 | 2183 | ||
2184 | MODULE_DEVICE_TABLE(pci, stradis_pci_tbl); | ||
2185 | 2184 | ||
2186 | static struct pci_driver stradis_driver = { | 2185 | static struct pci_driver stradis_driver = { |
2187 | .name = "stradis", | 2186 | .name = "stradis", |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index f7eb402d5f2b..40590bae5ff7 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
@@ -196,14 +196,6 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
196 | i2c_master_send(c, buffer, 4); | 196 | i2c_master_send(c, buffer, 4); |
197 | default_tuner_init(c); | 197 | default_tuner_init(c); |
198 | break; | 198 | break; |
199 | case TUNER_LG_TDVS_H06XF: | ||
200 | /* Set the Auxiliary Byte. */ | ||
201 | buffer[2] &= ~0x20; | ||
202 | buffer[2] |= 0x18; | ||
203 | buffer[3] = 0x20; | ||
204 | i2c_master_send(c, buffer, 4); | ||
205 | default_tuner_init(c); | ||
206 | break; | ||
207 | case TUNER_PHILIPS_TD1316: | 199 | case TUNER_PHILIPS_TD1316: |
208 | buffer[0] = 0x0b; | 200 | buffer[0] = 0x0b; |
209 | buffer[1] = 0xdc; | 201 | buffer[1] = 0xdc; |
@@ -598,6 +590,7 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
598 | if (t->standby) | 590 | if (t->standby) |
599 | t->standby (client); | 591 | t->standby (client); |
600 | break; | 592 | break; |
593 | #ifdef CONFIG_VIDEO_V4L1 | ||
601 | case VIDIOCSAUDIO: | 594 | case VIDIOCSAUDIO: |
602 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) | 595 | if (check_mode(t, "VIDIOCSAUDIO") == EINVAL) |
603 | return 0; | 596 | return 0; |
@@ -607,17 +600,6 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
607 | /* Should be implemented, since bttv calls it */ | 600 | /* Should be implemented, since bttv calls it */ |
608 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); | 601 | tuner_dbg("VIDIOCSAUDIO not implemented.\n"); |
609 | break; | 602 | break; |
610 | case TDA9887_SET_CONFIG: | ||
611 | if (t->type == TUNER_TDA9887) { | ||
612 | int *i = arg; | ||
613 | |||
614 | t->tda9887_config = *i; | ||
615 | set_freq(client, t->tv_freq); | ||
616 | } | ||
617 | break; | ||
618 | /* --- v4l ioctls --- */ | ||
619 | /* take care: bttv does userspace copying, we'll get a | ||
620 | kernel pointer here... */ | ||
621 | case VIDIOCSCHAN: | 603 | case VIDIOCSCHAN: |
622 | { | 604 | { |
623 | static const v4l2_std_id map[] = { | 605 | static const v4l2_std_id map[] = { |
@@ -701,7 +683,18 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
701 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; | 683 | ? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO; |
702 | return 0; | 684 | return 0; |
703 | } | 685 | } |
686 | #endif | ||
687 | case TDA9887_SET_CONFIG: | ||
688 | if (t->type == TUNER_TDA9887) { | ||
689 | int *i = arg; | ||
704 | 690 | ||
691 | t->tda9887_config = *i; | ||
692 | set_freq(client, t->tv_freq); | ||
693 | } | ||
694 | break; | ||
695 | /* --- v4l ioctls --- */ | ||
696 | /* take care: bttv does userspace copying, we'll get a | ||
697 | kernel pointer here... */ | ||
705 | case VIDIOC_S_STD: | 698 | case VIDIOC_S_STD: |
706 | { | 699 | { |
707 | v4l2_std_id *id = arg; | 700 | v4l2_std_id *id = arg; |
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index d071c5cbf013..abe37cf632c6 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
@@ -339,7 +339,20 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
339 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 339 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 340 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
341 | 341 | ||
342 | if (t->type == TUNER_MICROTUNE_4042FI5) { | 342 | switch (t->type) { |
343 | case TUNER_LG_TDVS_H06XF: | ||
344 | /* Set the Auxiliary Byte. */ | ||
345 | buffer[0] = buffer[2]; | ||
346 | buffer[0] &= ~0x20; | ||
347 | buffer[0] |= 0x18; | ||
348 | buffer[1] = 0x20; | ||
349 | tuner_dbg("tv 0x%02x 0x%02x\n",buffer[0],buffer[1]); | ||
350 | |||
351 | if (2 != (rc = i2c_master_send(c,buffer,2))) | ||
352 | tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc); | ||
353 | break; | ||
354 | case TUNER_MICROTUNE_4042FI5: | ||
355 | { | ||
343 | // FIXME - this may also work for other tuners | 356 | // FIXME - this may also work for other tuners |
344 | unsigned long timeout = jiffies + msecs_to_jiffies(1); | 357 | unsigned long timeout = jiffies + msecs_to_jiffies(1); |
345 | u8 status_byte = 0; | 358 | u8 status_byte = 0; |
@@ -364,10 +377,12 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
364 | buffer[2] = config; | 377 | buffer[2] = config; |
365 | buffer[3] = cb; | 378 | buffer[3] = cb; |
366 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | 379 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", |
367 | buffer[0],buffer[1],buffer[2],buffer[3]); | 380 | buffer[0],buffer[1],buffer[2],buffer[3]); |
368 | 381 | ||
369 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 382 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
370 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 383 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
384 | break; | ||
385 | } | ||
371 | } | 386 | } |
372 | } | 387 | } |
373 | 388 | ||
diff --git a/drivers/media/video/usbvideo/Kconfig b/drivers/media/video/usbvideo/Kconfig index 59fb899f31f3..a0fd82b924f2 100644 --- a/drivers/media/video/usbvideo/Kconfig +++ b/drivers/media/video/usbvideo/Kconfig | |||
@@ -3,7 +3,7 @@ config VIDEO_USBVIDEO | |||
3 | 3 | ||
4 | config USB_VICAM | 4 | config USB_VICAM |
5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" | 5 | tristate "USB 3com HomeConnect (aka vicam) support (EXPERIMENTAL)" |
6 | depends on USB && VIDEO_V4L1 && EXPERIMENTAL | 6 | depends on USB && VIDEO_DEV && VIDEO_V4L1 && EXPERIMENTAL |
7 | select VIDEO_USBVIDEO | 7 | select VIDEO_USBVIDEO |
8 | ---help--- | 8 | ---help--- |
9 | Say Y here if you have 3com homeconnect camera (vicam). | 9 | Say Y here if you have 3com homeconnect camera (vicam). |
@@ -13,7 +13,7 @@ config USB_VICAM | |||
13 | 13 | ||
14 | config USB_IBMCAM | 14 | config USB_IBMCAM |
15 | tristate "USB IBM (Xirlink) C-it Camera support" | 15 | tristate "USB IBM (Xirlink) C-it Camera support" |
16 | depends on USB && VIDEO_V4L1 | 16 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
17 | select VIDEO_USBVIDEO | 17 | select VIDEO_USBVIDEO |
18 | ---help--- | 18 | ---help--- |
19 | Say Y here if you want to connect a IBM "C-It" camera, also known as | 19 | Say Y here if you want to connect a IBM "C-It" camera, also known as |
@@ -28,7 +28,7 @@ config USB_IBMCAM | |||
28 | 28 | ||
29 | config USB_KONICAWC | 29 | config USB_KONICAWC |
30 | tristate "USB Konica Webcam support" | 30 | tristate "USB Konica Webcam support" |
31 | depends on USB && VIDEO_V4L1 | 31 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
32 | select VIDEO_USBVIDEO | 32 | select VIDEO_USBVIDEO |
33 | ---help--- | 33 | ---help--- |
34 | Say Y here if you want support for webcams based on a Konica | 34 | Say Y here if you want support for webcams based on a Konica |
@@ -39,7 +39,7 @@ config USB_KONICAWC | |||
39 | 39 | ||
40 | config USB_QUICKCAM_MESSENGER | 40 | config USB_QUICKCAM_MESSENGER |
41 | tristate "USB Logitech Quickcam Messenger" | 41 | tristate "USB Logitech Quickcam Messenger" |
42 | depends on USB && VIDEO_DEV | 42 | depends on USB && VIDEO_DEV && VIDEO_V4L1 |
43 | select VIDEO_USBVIDEO | 43 | select VIDEO_USBVIDEO |
44 | ---help--- | 44 | ---help--- |
45 | Say Y or M here to enable support for the USB Logitech Quickcam | 45 | Say Y or M here to enable support for the USB Logitech Quickcam |
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index f06dc19e504a..2ecbeffb559e 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c | |||
@@ -202,7 +202,7 @@ static char *v4l2_memory_names[] = { | |||
202 | /* ------------------------------------------------------------------ */ | 202 | /* ------------------------------------------------------------------ */ |
203 | /* debug help functions */ | 203 | /* debug help functions */ |
204 | 204 | ||
205 | #ifdef HAVE_V4L1 | 205 | #ifdef CONFIG_V4L1_COMPAT |
206 | static const char *v4l1_ioctls[] = { | 206 | static const char *v4l1_ioctls[] = { |
207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", | 207 | [_IOC_NR(VIDIOCGCAP)] = "VIDIOCGCAP", |
208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", | 208 | [_IOC_NR(VIDIOCGCHAN)] = "VIDIOCGCHAN", |
@@ -301,7 +301,7 @@ static const char *v4l2_ioctls[] = { | |||
301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) | 301 | #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) |
302 | 302 | ||
303 | static const char *v4l2_int_ioctls[] = { | 303 | static const char *v4l2_int_ioctls[] = { |
304 | #ifdef HAVE_VIDEO_DECODER | 304 | #ifdef CONFIG_V4L1_COMPAT |
305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", | 305 | [_IOC_NR(DECODER_GET_CAPABILITIES)] = "DECODER_GET_CAPABILITIES", |
306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", | 306 | [_IOC_NR(DECODER_GET_STATUS)] = "DECODER_GET_STATUS", |
307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", | 307 | [_IOC_NR(DECODER_SET_NORM)] = "DECODER_SET_NORM", |
@@ -367,7 +367,7 @@ void v4l_printk_ioctl(unsigned int cmd) | |||
367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? | 367 | (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ? |
368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); | 368 | v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd); |
369 | break; | 369 | break; |
370 | #ifdef HAVE_V4L1 | 370 | #ifdef CONFIG_V4L1_COMPAT |
371 | case 'v': | 371 | case 'v': |
372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", | 372 | printk("v4l1 ioctl %s, dir=%s (0x%08x)\n", |
373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? | 373 | (_IOC_NR(cmd) < V4L1_IOCTLS) ? |
@@ -414,6 +414,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
414 | printk ("%s: tuner type=%d\n", s, *p); | 414 | printk ("%s: tuner type=%d\n", s, *p); |
415 | break; | 415 | break; |
416 | } | 416 | } |
417 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
417 | case DECODER_SET_VBI_BYPASS: | 418 | case DECODER_SET_VBI_BYPASS: |
418 | case DECODER_ENABLE_OUTPUT: | 419 | case DECODER_ENABLE_OUTPUT: |
419 | case DECODER_GET_STATUS: | 420 | case DECODER_GET_STATUS: |
@@ -424,6 +425,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
424 | case VIDIOCCAPTURE: | 425 | case VIDIOCCAPTURE: |
425 | case VIDIOCSYNC: | 426 | case VIDIOCSYNC: |
426 | case VIDIOCSWRITEMODE: | 427 | case VIDIOCSWRITEMODE: |
428 | #endif | ||
427 | case TUNER_SET_TYPE_ADDR: | 429 | case TUNER_SET_TYPE_ADDR: |
428 | case TUNER_SET_STANDBY: | 430 | case TUNER_SET_STANDBY: |
429 | case TDA9887_SET_CONFIG: | 431 | case TDA9887_SET_CONFIG: |
@@ -755,6 +757,7 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
755 | p->afc); | 757 | p->afc); |
756 | break; | 758 | break; |
757 | } | 759 | } |
760 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
758 | case VIDIOCGVBIFMT: | 761 | case VIDIOCGVBIFMT: |
759 | case VIDIOCSVBIFMT: | 762 | case VIDIOCSVBIFMT: |
760 | { | 763 | { |
@@ -924,6 +927,14 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
924 | p->clipcount); | 927 | p->clipcount); |
925 | break; | 928 | break; |
926 | } | 929 | } |
930 | case VIDIOCGFREQ: | ||
931 | case VIDIOCSFREQ: | ||
932 | { | ||
933 | unsigned long *p=arg; | ||
934 | printk ("%s: value=%lu\n", s, *p); | ||
935 | break; | ||
936 | } | ||
937 | #endif | ||
927 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: | 938 | case VIDIOC_INT_AUDIO_CLOCK_FREQ: |
928 | case VIDIOC_INT_I2S_CLOCK_FREQ: | 939 | case VIDIOC_INT_I2S_CLOCK_FREQ: |
929 | case VIDIOC_INT_S_STANDBY: | 940 | case VIDIOC_INT_S_STANDBY: |
@@ -933,13 +944,6 @@ void v4l_printk_ioctl_arg(char *s,unsigned int cmd, void *arg) | |||
933 | printk ("%s: value=%d\n", s, *p); | 944 | printk ("%s: value=%d\n", s, *p); |
934 | break; | 945 | break; |
935 | } | 946 | } |
936 | case VIDIOCGFREQ: | ||
937 | case VIDIOCSFREQ: | ||
938 | { | ||
939 | unsigned long *p=arg; | ||
940 | printk ("%s: value=%lu\n", s, *p); | ||
941 | break; | ||
942 | } | ||
943 | case VIDIOC_G_STD: | 947 | case VIDIOC_G_STD: |
944 | case VIDIOC_S_STD: | 948 | case VIDIOC_S_STD: |
945 | case VIDIOC_QUERYSTD: | 949 | case VIDIOC_QUERYSTD: |
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c index b26ebaff226f..0fc90cd393f6 100644 --- a/drivers/media/video/videodev.c +++ b/drivers/media/video/videodev.c | |||
@@ -760,7 +760,7 @@ static int __video_do_ioctl(struct inode *inode, struct file *file, | |||
760 | ret=vfd->vidioc_overlay(file, fh, *i); | 760 | ret=vfd->vidioc_overlay(file, fh, *i); |
761 | break; | 761 | break; |
762 | } | 762 | } |
763 | #ifdef HAVE_V4L1 | 763 | #ifdef CONFIG_V4L1_COMPAT |
764 | /* --- streaming capture ------------------------------------- */ | 764 | /* --- streaming capture ------------------------------------- */ |
765 | case VIDIOCGMBUF: | 765 | case VIDIOCGMBUF: |
766 | { | 766 | { |
@@ -1512,6 +1512,7 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1512 | int i=0; | 1512 | int i=0; |
1513 | int base; | 1513 | int base; |
1514 | int end; | 1514 | int end; |
1515 | int ret; | ||
1515 | char *name_base; | 1516 | char *name_base; |
1516 | 1517 | ||
1517 | switch(type) | 1518 | switch(type) |
@@ -1537,6 +1538,8 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1537 | name_base = "radio"; | 1538 | name_base = "radio"; |
1538 | break; | 1539 | break; |
1539 | default: | 1540 | default: |
1541 | printk(KERN_ERR "%s called with unknown type: %d\n", | ||
1542 | __FUNCTION__, type); | ||
1540 | return -1; | 1543 | return -1; |
1541 | } | 1544 | } |
1542 | 1545 | ||
@@ -1571,9 +1574,18 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1571 | vfd->class_dev.class = &video_class; | 1574 | vfd->class_dev.class = &video_class; |
1572 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); | 1575 | vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor); |
1573 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); | 1576 | sprintf(vfd->class_dev.class_id, "%s%d", name_base, i - base); |
1574 | class_device_register(&vfd->class_dev); | 1577 | ret = class_device_register(&vfd->class_dev); |
1575 | class_device_create_file(&vfd->class_dev, | 1578 | if (ret < 0) { |
1576 | &class_device_attr_name); | 1579 | printk(KERN_ERR "%s: class_device_register failed\n", |
1580 | __FUNCTION__); | ||
1581 | goto fail_minor; | ||
1582 | } | ||
1583 | ret = class_device_create_file(&vfd->class_dev, &class_device_attr_name); | ||
1584 | if (ret < 0) { | ||
1585 | printk(KERN_ERR "%s: class_device_create_file 'name' failed\n", | ||
1586 | __FUNCTION__); | ||
1587 | goto fail_classdev; | ||
1588 | } | ||
1577 | 1589 | ||
1578 | #if 1 | 1590 | #if 1 |
1579 | /* needed until all drivers are fixed */ | 1591 | /* needed until all drivers are fixed */ |
@@ -1583,6 +1595,15 @@ int video_register_device(struct video_device *vfd, int type, int nr) | |||
1583 | "http://lwn.net/Articles/36850/\n", vfd->name); | 1595 | "http://lwn.net/Articles/36850/\n", vfd->name); |
1584 | #endif | 1596 | #endif |
1585 | return 0; | 1597 | return 0; |
1598 | |||
1599 | fail_classdev: | ||
1600 | class_device_unregister(&vfd->class_dev); | ||
1601 | fail_minor: | ||
1602 | mutex_lock(&videodev_lock); | ||
1603 | video_device[vfd->minor] = NULL; | ||
1604 | vfd->minor = -1; | ||
1605 | mutex_unlock(&videodev_lock); | ||
1606 | return ret; | ||
1586 | } | 1607 | } |
1587 | 1608 | ||
1588 | /** | 1609 | /** |
diff --git a/drivers/media/video/vivi.c b/drivers/media/video/vivi.c index 41d23c8acbd8..38bd0c1018c2 100644 --- a/drivers/media/video/vivi.c +++ b/drivers/media/video/vivi.c | |||
@@ -986,7 +986,7 @@ static int vidioc_dqbuf (struct file *file, void *priv, struct v4l2_buffer *p) | |||
986 | file->f_flags & O_NONBLOCK)); | 986 | file->f_flags & O_NONBLOCK)); |
987 | } | 987 | } |
988 | 988 | ||
989 | #ifdef HAVE_V4L1 | 989 | #ifdef CONFIG_V4L1_COMPAT |
990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) | 990 | static int vidiocgmbuf (struct file *file, void *priv, struct video_mbuf *mbuf) |
991 | { | 991 | { |
992 | struct vivi_fh *fh=priv; | 992 | struct vivi_fh *fh=priv; |
@@ -1328,7 +1328,7 @@ static struct video_device vivi = { | |||
1328 | .vidioc_s_ctrl = vidioc_s_ctrl, | 1328 | .vidioc_s_ctrl = vidioc_s_ctrl, |
1329 | .vidioc_streamon = vidioc_streamon, | 1329 | .vidioc_streamon = vidioc_streamon, |
1330 | .vidioc_streamoff = vidioc_streamoff, | 1330 | .vidioc_streamoff = vidioc_streamoff, |
1331 | #ifdef HAVE_V4L1 | 1331 | #ifdef CONFIG_V4L1_COMPAT |
1332 | .vidiocgmbuf = vidiocgmbuf, | 1332 | .vidiocgmbuf = vidiocgmbuf, |
1333 | #endif | 1333 | #endif |
1334 | .tvnorms = tvnorms, | 1334 | .tvnorms = tvnorms, |
diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index b14e89004c3a..0a0e0cd81a23 100644 --- a/drivers/net/appletalk/Kconfig +++ b/drivers/net/appletalk/Kconfig | |||
@@ -29,7 +29,7 @@ config ATALK | |||
29 | even politically correct people are allowed to say Y here. | 29 | even politically correct people are allowed to say Y here. |
30 | 30 | ||
31 | config DEV_APPLETALK | 31 | config DEV_APPLETALK |
32 | bool "Appletalk interfaces support" | 32 | tristate "Appletalk interfaces support" |
33 | depends on ATALK | 33 | depends on ATALK |
34 | help | 34 | help |
35 | AppleTalk is the protocol that Apple computers can use to communicate | 35 | AppleTalk is the protocol that Apple computers can use to communicate |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index da62db897426..627f224d78bc 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3127,7 +3127,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
3127 | break; | 3127 | break; |
3128 | } | 3128 | } |
3129 | 3129 | ||
3130 | /* NOTE: dev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN | 3130 | /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN |
3131 | * means we reserve 2 more, this pushes us to allocate from the next | 3131 | * means we reserve 2 more, this pushes us to allocate from the next |
3132 | * larger slab size | 3132 | * larger slab size |
3133 | * i.e. RXBUFFER_2048 --> size-4096 slab */ | 3133 | * i.e. RXBUFFER_2048 --> size-4096 slab */ |
@@ -3708,7 +3708,7 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3708 | #define E1000_CB_LENGTH 256 | 3708 | #define E1000_CB_LENGTH 256 |
3709 | if (length < E1000_CB_LENGTH) { | 3709 | if (length < E1000_CB_LENGTH) { |
3710 | struct sk_buff *new_skb = | 3710 | struct sk_buff *new_skb = |
3711 | dev_alloc_skb(length + NET_IP_ALIGN); | 3711 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); |
3712 | if (new_skb) { | 3712 | if (new_skb) { |
3713 | skb_reserve(new_skb, NET_IP_ALIGN); | 3713 | skb_reserve(new_skb, NET_IP_ALIGN); |
3714 | new_skb->dev = netdev; | 3714 | new_skb->dev = netdev; |
@@ -3979,7 +3979,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | |||
3979 | 3979 | ||
3980 | while (cleaned_count--) { | 3980 | while (cleaned_count--) { |
3981 | if (!(skb = buffer_info->skb)) | 3981 | if (!(skb = buffer_info->skb)) |
3982 | skb = dev_alloc_skb(bufsz); | 3982 | skb = netdev_alloc_skb(netdev, bufsz); |
3983 | else { | 3983 | else { |
3984 | skb_trim(skb, 0); | 3984 | skb_trim(skb, 0); |
3985 | goto map_skb; | 3985 | goto map_skb; |
@@ -3997,7 +3997,7 @@ e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | |||
3997 | DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes " | 3997 | DPRINTK(RX_ERR, ERR, "skb align check failed: %u bytes " |
3998 | "at %p\n", bufsz, skb->data); | 3998 | "at %p\n", bufsz, skb->data); |
3999 | /* Try again, without freeing the previous */ | 3999 | /* Try again, without freeing the previous */ |
4000 | skb = dev_alloc_skb(bufsz); | 4000 | skb = netdev_alloc_skb(netdev, bufsz); |
4001 | /* Failed allocation, critical failure */ | 4001 | /* Failed allocation, critical failure */ |
4002 | if (!skb) { | 4002 | if (!skb) { |
4003 | dev_kfree_skb(oldskb); | 4003 | dev_kfree_skb(oldskb); |
@@ -4121,7 +4121,8 @@ e1000_alloc_rx_buffers_ps(struct e1000_adapter *adapter, | |||
4121 | rx_desc->read.buffer_addr[j+1] = ~0; | 4121 | rx_desc->read.buffer_addr[j+1] = ~0; |
4122 | } | 4122 | } |
4123 | 4123 | ||
4124 | skb = dev_alloc_skb(adapter->rx_ps_bsize0 + NET_IP_ALIGN); | 4124 | skb = netdev_alloc_skb(netdev, |
4125 | adapter->rx_ps_bsize0 + NET_IP_ALIGN); | ||
4125 | 4126 | ||
4126 | if (unlikely(!skb)) { | 4127 | if (unlikely(!skb)) { |
4127 | adapter->alloc_rx_buff_failed++; | 4128 | adapter->alloc_rx_buff_failed++; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index c3e52c806b13..06440a86baef 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -177,6 +177,7 @@ struct myri10ge_priv { | |||
177 | struct work_struct watchdog_work; | 177 | struct work_struct watchdog_work; |
178 | struct timer_list watchdog_timer; | 178 | struct timer_list watchdog_timer; |
179 | int watchdog_tx_done; | 179 | int watchdog_tx_done; |
180 | int watchdog_tx_req; | ||
180 | int watchdog_resets; | 181 | int watchdog_resets; |
181 | int tx_linearized; | 182 | int tx_linearized; |
182 | int pause; | 183 | int pause; |
@@ -448,6 +449,7 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
448 | struct mcp_gen_header *hdr; | 449 | struct mcp_gen_header *hdr; |
449 | size_t hdr_offset; | 450 | size_t hdr_offset; |
450 | int status; | 451 | int status; |
452 | unsigned i; | ||
451 | 453 | ||
452 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { | 454 | if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) { |
453 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", | 455 | dev_err(dev, "Unable to load %s firmware image via hotplug\n", |
@@ -479,18 +481,12 @@ static int myri10ge_load_hotplug_firmware(struct myri10ge_priv *mgp, u32 * size) | |||
479 | goto abort_with_fw; | 481 | goto abort_with_fw; |
480 | 482 | ||
481 | crc = crc32(~0, fw->data, fw->size); | 483 | crc = crc32(~0, fw->data, fw->size); |
482 | if (mgp->tx.boundary == 2048) { | 484 | for (i = 0; i < fw->size; i += 256) { |
483 | /* Avoid PCI burst on chipset with unaligned completions. */ | 485 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET + i, |
484 | int i; | 486 | fw->data + i, |
485 | __iomem u32 *ptr = (__iomem u32 *) (mgp->sram + | 487 | min(256U, (unsigned)(fw->size - i))); |
486 | MYRI10GE_FW_OFFSET); | 488 | mb(); |
487 | for (i = 0; i < fw->size / 4; i++) { | 489 | readb(mgp->sram); |
488 | __raw_writel(((u32 *) fw->data)[i], ptr + i); | ||
489 | wmb(); | ||
490 | } | ||
491 | } else { | ||
492 | myri10ge_pio_copy(mgp->sram + MYRI10GE_FW_OFFSET, fw->data, | ||
493 | fw->size); | ||
494 | } | 490 | } |
495 | /* corruption checking is good for parity recovery and buggy chipset */ | 491 | /* corruption checking is good for parity recovery and buggy chipset */ |
496 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); | 492 | memcpy_fromio(fw->data, mgp->sram + MYRI10GE_FW_OFFSET, fw->size); |
@@ -2547,7 +2543,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2547 | 2543 | ||
2548 | mgp = (struct myri10ge_priv *)arg; | 2544 | mgp = (struct myri10ge_priv *)arg; |
2549 | if (mgp->tx.req != mgp->tx.done && | 2545 | if (mgp->tx.req != mgp->tx.done && |
2550 | mgp->tx.done == mgp->watchdog_tx_done) | 2546 | mgp->tx.done == mgp->watchdog_tx_done && |
2547 | mgp->watchdog_tx_req != mgp->watchdog_tx_done) | ||
2551 | /* nic seems like it might be stuck.. */ | 2548 | /* nic seems like it might be stuck.. */ |
2552 | schedule_work(&mgp->watchdog_work); | 2549 | schedule_work(&mgp->watchdog_work); |
2553 | else | 2550 | else |
@@ -2556,6 +2553,7 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
2556 | jiffies + myri10ge_watchdog_timeout * HZ); | 2553 | jiffies + myri10ge_watchdog_timeout * HZ); |
2557 | 2554 | ||
2558 | mgp->watchdog_tx_done = mgp->tx.done; | 2555 | mgp->watchdog_tx_done = mgp->tx.done; |
2556 | mgp->watchdog_tx_req = mgp->tx.req; | ||
2559 | } | 2557 | } |
2560 | 2558 | ||
2561 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 2559 | static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 7d5c2233c252..f5aad77288f9 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -419,9 +419,8 @@ void phy_start_machine(struct phy_device *phydev, | |||
419 | 419 | ||
420 | /* phy_stop_machine | 420 | /* phy_stop_machine |
421 | * | 421 | * |
422 | * description: Stops the state machine timer, sets the state to | 422 | * description: Stops the state machine timer, sets the state to UP |
423 | * UP (unless it wasn't up yet), and then frees the interrupt, | 423 | * (unless it wasn't up yet). This function must be called BEFORE |
424 | * if it is in use. This function must be called BEFORE | ||
425 | * phy_detach. | 424 | * phy_detach. |
426 | */ | 425 | */ |
427 | void phy_stop_machine(struct phy_device *phydev) | 426 | void phy_stop_machine(struct phy_device *phydev) |
@@ -433,9 +432,6 @@ void phy_stop_machine(struct phy_device *phydev) | |||
433 | phydev->state = PHY_UP; | 432 | phydev->state = PHY_UP; |
434 | spin_unlock(&phydev->lock); | 433 | spin_unlock(&phydev->lock); |
435 | 434 | ||
436 | if (phydev->irq != PHY_POLL) | ||
437 | phy_stop_interrupts(phydev); | ||
438 | |||
439 | phydev->adjust_state = NULL; | 435 | phydev->adjust_state = NULL; |
440 | } | 436 | } |
441 | 437 | ||
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e1fe3a0a7b0b..132ed32bce1a 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -76,7 +76,7 @@ | |||
76 | #include "s2io.h" | 76 | #include "s2io.h" |
77 | #include "s2io-regs.h" | 77 | #include "s2io-regs.h" |
78 | 78 | ||
79 | #define DRV_VERSION "2.0.14.2" | 79 | #define DRV_VERSION "2.0.15.2" |
80 | 80 | ||
81 | /* S2io Driver name & version. */ | 81 | /* S2io Driver name & version. */ |
82 | static char s2io_driver_name[] = "Neterion"; | 82 | static char s2io_driver_name[] = "Neterion"; |
@@ -370,38 +370,50 @@ static const u64 fix_mac[] = { | |||
370 | END_SIGN | 370 | END_SIGN |
371 | }; | 371 | }; |
372 | 372 | ||
373 | MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>"); | ||
374 | MODULE_LICENSE("GPL"); | ||
375 | MODULE_VERSION(DRV_VERSION); | ||
376 | |||
377 | |||
373 | /* Module Loadable parameters. */ | 378 | /* Module Loadable parameters. */ |
374 | static unsigned int tx_fifo_num = 1; | 379 | S2IO_PARM_INT(tx_fifo_num, 1); |
375 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = | 380 | S2IO_PARM_INT(rx_ring_num, 1); |
376 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; | 381 | |
377 | static unsigned int rx_ring_num = 1; | 382 | |
378 | static unsigned int rx_ring_sz[MAX_RX_RINGS] = | 383 | S2IO_PARM_INT(rx_ring_mode, 1); |
379 | {[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT}; | 384 | S2IO_PARM_INT(use_continuous_tx_intrs, 1); |
380 | static unsigned int rts_frm_len[MAX_RX_RINGS] = | 385 | S2IO_PARM_INT(rmac_pause_time, 0x100); |
381 | {[0 ...(MAX_RX_RINGS - 1)] = 0 }; | 386 | S2IO_PARM_INT(mc_pause_threshold_q0q3, 187); |
382 | static unsigned int rx_ring_mode = 1; | 387 | S2IO_PARM_INT(mc_pause_threshold_q4q7, 187); |
383 | static unsigned int use_continuous_tx_intrs = 1; | 388 | S2IO_PARM_INT(shared_splits, 0); |
384 | static unsigned int rmac_pause_time = 0x100; | 389 | S2IO_PARM_INT(tmac_util_period, 5); |
385 | static unsigned int mc_pause_threshold_q0q3 = 187; | 390 | S2IO_PARM_INT(rmac_util_period, 5); |
386 | static unsigned int mc_pause_threshold_q4q7 = 187; | 391 | S2IO_PARM_INT(bimodal, 0); |
387 | static unsigned int shared_splits; | 392 | S2IO_PARM_INT(l3l4hdr_size, 128); |
388 | static unsigned int tmac_util_period = 5; | ||
389 | static unsigned int rmac_util_period = 5; | ||
390 | static unsigned int bimodal = 0; | ||
391 | static unsigned int l3l4hdr_size = 128; | ||
392 | #ifndef CONFIG_S2IO_NAPI | ||
393 | static unsigned int indicate_max_pkts; | ||
394 | #endif | ||
395 | /* Frequency of Rx desc syncs expressed as power of 2 */ | 393 | /* Frequency of Rx desc syncs expressed as power of 2 */ |
396 | static unsigned int rxsync_frequency = 3; | 394 | S2IO_PARM_INT(rxsync_frequency, 3); |
397 | /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ | 395 | /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ |
398 | static unsigned int intr_type = 0; | 396 | S2IO_PARM_INT(intr_type, 0); |
399 | /* Large receive offload feature */ | 397 | /* Large receive offload feature */ |
400 | static unsigned int lro = 0; | 398 | S2IO_PARM_INT(lro, 0); |
401 | /* Max pkts to be aggregated by LRO at one time. If not specified, | 399 | /* Max pkts to be aggregated by LRO at one time. If not specified, |
402 | * aggregation happens until we hit max IP pkt size(64K) | 400 | * aggregation happens until we hit max IP pkt size(64K) |
403 | */ | 401 | */ |
404 | static unsigned int lro_max_pkts = 0xFFFF; | 402 | S2IO_PARM_INT(lro_max_pkts, 0xFFFF); |
403 | #ifndef CONFIG_S2IO_NAPI | ||
404 | S2IO_PARM_INT(indicate_max_pkts, 0); | ||
405 | #endif | ||
406 | |||
407 | static unsigned int tx_fifo_len[MAX_TX_FIFOS] = | ||
408 | {DEFAULT_FIFO_0_LEN, [1 ...(MAX_TX_FIFOS - 1)] = DEFAULT_FIFO_1_7_LEN}; | ||
409 | static unsigned int rx_ring_sz[MAX_RX_RINGS] = | ||
410 | {[0 ...(MAX_RX_RINGS - 1)] = SMALL_BLK_CNT}; | ||
411 | static unsigned int rts_frm_len[MAX_RX_RINGS] = | ||
412 | {[0 ...(MAX_RX_RINGS - 1)] = 0 }; | ||
413 | |||
414 | module_param_array(tx_fifo_len, uint, NULL, 0); | ||
415 | module_param_array(rx_ring_sz, uint, NULL, 0); | ||
416 | module_param_array(rts_frm_len, uint, NULL, 0); | ||
405 | 417 | ||
406 | /* | 418 | /* |
407 | * S2IO device table. | 419 | * S2IO device table. |
@@ -464,10 +476,9 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
464 | size += config->tx_cfg[i].fifo_len; | 476 | size += config->tx_cfg[i].fifo_len; |
465 | } | 477 | } |
466 | if (size > MAX_AVAILABLE_TXDS) { | 478 | if (size > MAX_AVAILABLE_TXDS) { |
467 | DBG_PRINT(ERR_DBG, "%s: Requested TxDs too high, ", | 479 | DBG_PRINT(ERR_DBG, "s2io: Requested TxDs too high, "); |
468 | __FUNCTION__); | ||
469 | DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); | 480 | DBG_PRINT(ERR_DBG, "Requested: %d, max supported: 8192\n", size); |
470 | return FAILURE; | 481 | return -EINVAL; |
471 | } | 482 | } |
472 | 483 | ||
473 | lst_size = (sizeof(TxD_t) * config->max_txds); | 484 | lst_size = (sizeof(TxD_t) * config->max_txds); |
@@ -547,6 +558,7 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
547 | nic->ufo_in_band_v = kmalloc((sizeof(u64) * size), GFP_KERNEL); | 558 | nic->ufo_in_band_v = kmalloc((sizeof(u64) * size), GFP_KERNEL); |
548 | if (!nic->ufo_in_band_v) | 559 | if (!nic->ufo_in_band_v) |
549 | return -ENOMEM; | 560 | return -ENOMEM; |
561 | memset(nic->ufo_in_band_v, 0, size); | ||
550 | 562 | ||
551 | /* Allocation and initialization of RXDs in Rings */ | 563 | /* Allocation and initialization of RXDs in Rings */ |
552 | size = 0; | 564 | size = 0; |
@@ -1213,7 +1225,7 @@ static int init_nic(struct s2io_nic *nic) | |||
1213 | break; | 1225 | break; |
1214 | } | 1226 | } |
1215 | 1227 | ||
1216 | /* Enable Tx FIFO partition 0. */ | 1228 | /* Enable all configured Tx FIFO partitions */ |
1217 | val64 = readq(&bar0->tx_fifo_partition_0); | 1229 | val64 = readq(&bar0->tx_fifo_partition_0); |
1218 | val64 |= (TX_FIFO_PARTITION_EN); | 1230 | val64 |= (TX_FIFO_PARTITION_EN); |
1219 | writeq(val64, &bar0->tx_fifo_partition_0); | 1231 | writeq(val64, &bar0->tx_fifo_partition_0); |
@@ -1650,7 +1662,7 @@ static void en_dis_able_nic_intrs(struct s2io_nic *nic, u16 mask, int flag) | |||
1650 | writeq(temp64, &bar0->general_int_mask); | 1662 | writeq(temp64, &bar0->general_int_mask); |
1651 | /* | 1663 | /* |
1652 | * If Hercules adapter enable GPIO otherwise | 1664 | * If Hercules adapter enable GPIO otherwise |
1653 | * disabled all PCIX, Flash, MDIO, IIC and GPIO | 1665 | * disable all PCIX, Flash, MDIO, IIC and GPIO |
1654 | * interrupts for now. | 1666 | * interrupts for now. |
1655 | * TODO | 1667 | * TODO |
1656 | */ | 1668 | */ |
@@ -2119,7 +2131,7 @@ static struct sk_buff *s2io_txdl_getskb(fifo_info_t *fifo_data, TxD_t *txdlp, in | |||
2119 | frag->size, PCI_DMA_TODEVICE); | 2131 | frag->size, PCI_DMA_TODEVICE); |
2120 | } | 2132 | } |
2121 | } | 2133 | } |
2122 | txdlp->Host_Control = 0; | 2134 | memset(txdlp,0, (sizeof(TxD_t) * fifo_data->max_txds)); |
2123 | return(skb); | 2135 | return(skb); |
2124 | } | 2136 | } |
2125 | 2137 | ||
@@ -2371,9 +2383,14 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) | |||
2371 | skb->data = (void *) (unsigned long)tmp; | 2383 | skb->data = (void *) (unsigned long)tmp; |
2372 | skb->tail = (void *) (unsigned long)tmp; | 2384 | skb->tail = (void *) (unsigned long)tmp; |
2373 | 2385 | ||
2374 | ((RxD3_t*)rxdp)->Buffer0_ptr = | 2386 | if (!(((RxD3_t*)rxdp)->Buffer0_ptr)) |
2375 | pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, | 2387 | ((RxD3_t*)rxdp)->Buffer0_ptr = |
2388 | pci_map_single(nic->pdev, ba->ba_0, BUF0_LEN, | ||
2376 | PCI_DMA_FROMDEVICE); | 2389 | PCI_DMA_FROMDEVICE); |
2390 | else | ||
2391 | pci_dma_sync_single_for_device(nic->pdev, | ||
2392 | (dma_addr_t) ((RxD3_t*)rxdp)->Buffer0_ptr, | ||
2393 | BUF0_LEN, PCI_DMA_FROMDEVICE); | ||
2377 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); | 2394 | rxdp->Control_2 = SET_BUFFER0_SIZE_3(BUF0_LEN); |
2378 | if (nic->rxd_mode == RXD_MODE_3B) { | 2395 | if (nic->rxd_mode == RXD_MODE_3B) { |
2379 | /* Two buffer mode */ | 2396 | /* Two buffer mode */ |
@@ -2386,10 +2403,13 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no) | |||
2386 | (nic->pdev, skb->data, dev->mtu + 4, | 2403 | (nic->pdev, skb->data, dev->mtu + 4, |
2387 | PCI_DMA_FROMDEVICE); | 2404 | PCI_DMA_FROMDEVICE); |
2388 | 2405 | ||
2389 | /* Buffer-1 will be dummy buffer not used */ | 2406 | /* Buffer-1 will be dummy buffer. Not used */ |
2390 | ((RxD3_t*)rxdp)->Buffer1_ptr = | 2407 | if (!(((RxD3_t*)rxdp)->Buffer1_ptr)) { |
2391 | pci_map_single(nic->pdev, ba->ba_1, BUF1_LEN, | 2408 | ((RxD3_t*)rxdp)->Buffer1_ptr = |
2392 | PCI_DMA_FROMDEVICE); | 2409 | pci_map_single(nic->pdev, |
2410 | ba->ba_1, BUF1_LEN, | ||
2411 | PCI_DMA_FROMDEVICE); | ||
2412 | } | ||
2393 | rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); | 2413 | rxdp->Control_2 |= SET_BUFFER1_SIZE_3(1); |
2394 | rxdp->Control_2 |= SET_BUFFER2_SIZE_3 | 2414 | rxdp->Control_2 |= SET_BUFFER2_SIZE_3 |
2395 | (dev->mtu + 4); | 2415 | (dev->mtu + 4); |
@@ -2614,23 +2634,23 @@ no_rx: | |||
2614 | } | 2634 | } |
2615 | #endif | 2635 | #endif |
2616 | 2636 | ||
2637 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2617 | /** | 2638 | /** |
2618 | * s2io_netpoll - Rx interrupt service handler for netpoll support | 2639 | * s2io_netpoll - netpoll event handler entry point |
2619 | * @dev : pointer to the device structure. | 2640 | * @dev : pointer to the device structure. |
2620 | * Description: | 2641 | * Description: |
2621 | * Polling 'interrupt' - used by things like netconsole to send skbs | 2642 | * This function will be called by upper layer to check for events on the |
2622 | * without having to re-enable interrupts. It's not called while | 2643 | * interface in situations where interrupts are disabled. It is used for |
2623 | * the interrupt routine is executing. | 2644 | * specific in-kernel networking tasks, such as remote consoles and kernel |
2645 | * debugging over the network (example netdump in RedHat). | ||
2624 | */ | 2646 | */ |
2625 | |||
2626 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2627 | static void s2io_netpoll(struct net_device *dev) | 2647 | static void s2io_netpoll(struct net_device *dev) |
2628 | { | 2648 | { |
2629 | nic_t *nic = dev->priv; | 2649 | nic_t *nic = dev->priv; |
2630 | mac_info_t *mac_control; | 2650 | mac_info_t *mac_control; |
2631 | struct config_param *config; | 2651 | struct config_param *config; |
2632 | XENA_dev_config_t __iomem *bar0 = nic->bar0; | 2652 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
2633 | u64 val64; | 2653 | u64 val64 = 0xFFFFFFFFFFFFFFFFULL; |
2634 | int i; | 2654 | int i; |
2635 | 2655 | ||
2636 | disable_irq(dev->irq); | 2656 | disable_irq(dev->irq); |
@@ -2639,9 +2659,17 @@ static void s2io_netpoll(struct net_device *dev) | |||
2639 | mac_control = &nic->mac_control; | 2659 | mac_control = &nic->mac_control; |
2640 | config = &nic->config; | 2660 | config = &nic->config; |
2641 | 2661 | ||
2642 | val64 = readq(&bar0->rx_traffic_int); | ||
2643 | writeq(val64, &bar0->rx_traffic_int); | 2662 | writeq(val64, &bar0->rx_traffic_int); |
2663 | writeq(val64, &bar0->tx_traffic_int); | ||
2644 | 2664 | ||
2665 | /* we need to free up the transmitted skbufs or else netpoll will | ||
2666 | * run out of skbs and will fail and eventually netpoll application such | ||
2667 | * as netdump will fail. | ||
2668 | */ | ||
2669 | for (i = 0; i < config->tx_fifo_num; i++) | ||
2670 | tx_intr_handler(&mac_control->fifos[i]); | ||
2671 | |||
2672 | /* check for received packet and indicate up to network */ | ||
2645 | for (i = 0; i < config->rx_ring_num; i++) | 2673 | for (i = 0; i < config->rx_ring_num; i++) |
2646 | rx_intr_handler(&mac_control->rings[i]); | 2674 | rx_intr_handler(&mac_control->rings[i]); |
2647 | 2675 | ||
@@ -2708,7 +2736,7 @@ static void rx_intr_handler(ring_info_t *ring_data) | |||
2708 | /* If your are next to put index then it's FIFO full condition */ | 2736 | /* If your are next to put index then it's FIFO full condition */ |
2709 | if ((get_block == put_block) && | 2737 | if ((get_block == put_block) && |
2710 | (get_info.offset + 1) == put_info.offset) { | 2738 | (get_info.offset + 1) == put_info.offset) { |
2711 | DBG_PRINT(ERR_DBG, "%s: Ring Full\n",dev->name); | 2739 | DBG_PRINT(INTR_DBG, "%s: Ring Full\n",dev->name); |
2712 | break; | 2740 | break; |
2713 | } | 2741 | } |
2714 | skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); | 2742 | skb = (struct sk_buff *) ((unsigned long)rxdp->Host_Control); |
@@ -2728,18 +2756,15 @@ static void rx_intr_handler(ring_info_t *ring_data) | |||
2728 | HEADER_SNAP_SIZE, | 2756 | HEADER_SNAP_SIZE, |
2729 | PCI_DMA_FROMDEVICE); | 2757 | PCI_DMA_FROMDEVICE); |
2730 | } else if (nic->rxd_mode == RXD_MODE_3B) { | 2758 | } else if (nic->rxd_mode == RXD_MODE_3B) { |
2731 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2759 | pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) |
2732 | ((RxD3_t*)rxdp)->Buffer0_ptr, | 2760 | ((RxD3_t*)rxdp)->Buffer0_ptr, |
2733 | BUF0_LEN, PCI_DMA_FROMDEVICE); | 2761 | BUF0_LEN, PCI_DMA_FROMDEVICE); |
2734 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2762 | pci_unmap_single(nic->pdev, (dma_addr_t) |
2735 | ((RxD3_t*)rxdp)->Buffer1_ptr, | ||
2736 | BUF1_LEN, PCI_DMA_FROMDEVICE); | ||
2737 | pci_unmap_single(nic->pdev, (dma_addr_t) | ||
2738 | ((RxD3_t*)rxdp)->Buffer2_ptr, | 2763 | ((RxD3_t*)rxdp)->Buffer2_ptr, |
2739 | dev->mtu + 4, | 2764 | dev->mtu + 4, |
2740 | PCI_DMA_FROMDEVICE); | 2765 | PCI_DMA_FROMDEVICE); |
2741 | } else { | 2766 | } else { |
2742 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2767 | pci_dma_sync_single_for_cpu(nic->pdev, (dma_addr_t) |
2743 | ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, | 2768 | ((RxD3_t*)rxdp)->Buffer0_ptr, BUF0_LEN, |
2744 | PCI_DMA_FROMDEVICE); | 2769 | PCI_DMA_FROMDEVICE); |
2745 | pci_unmap_single(nic->pdev, (dma_addr_t) | 2770 | pci_unmap_single(nic->pdev, (dma_addr_t) |
@@ -3327,7 +3352,7 @@ static void s2io_reset(nic_t * sp) | |||
3327 | 3352 | ||
3328 | /* Clear certain PCI/PCI-X fields after reset */ | 3353 | /* Clear certain PCI/PCI-X fields after reset */ |
3329 | if (sp->device_type == XFRAME_II_DEVICE) { | 3354 | if (sp->device_type == XFRAME_II_DEVICE) { |
3330 | /* Clear parity err detect bit */ | 3355 | /* Clear "detected parity error" bit */ |
3331 | pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); | 3356 | pci_write_config_word(sp->pdev, PCI_STATUS, 0x8000); |
3332 | 3357 | ||
3333 | /* Clearing PCIX Ecc status register */ | 3358 | /* Clearing PCIX Ecc status register */ |
@@ -3528,7 +3553,7 @@ static void restore_xmsi_data(nic_t *nic) | |||
3528 | u64 val64; | 3553 | u64 val64; |
3529 | int i; | 3554 | int i; |
3530 | 3555 | ||
3531 | for (i=0; i< nic->avail_msix_vectors; i++) { | 3556 | for (i=0; i < MAX_REQUESTED_MSI_X; i++) { |
3532 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); | 3557 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); |
3533 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); | 3558 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); |
3534 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); | 3559 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); |
@@ -3547,7 +3572,7 @@ static void store_xmsi_data(nic_t *nic) | |||
3547 | int i; | 3572 | int i; |
3548 | 3573 | ||
3549 | /* Store and display */ | 3574 | /* Store and display */ |
3550 | for (i=0; i< nic->avail_msix_vectors; i++) { | 3575 | for (i=0; i < MAX_REQUESTED_MSI_X; i++) { |
3551 | val64 = (BIT(15) | vBIT(i, 26, 6)); | 3576 | val64 = (BIT(15) | vBIT(i, 26, 6)); |
3552 | writeq(val64, &bar0->xmsi_access); | 3577 | writeq(val64, &bar0->xmsi_access); |
3553 | if (wait_for_msix_trans(nic, i)) { | 3578 | if (wait_for_msix_trans(nic, i)) { |
@@ -3808,13 +3833,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3808 | TxD_t *txdp; | 3833 | TxD_t *txdp; |
3809 | TxFIFO_element_t __iomem *tx_fifo; | 3834 | TxFIFO_element_t __iomem *tx_fifo; |
3810 | unsigned long flags; | 3835 | unsigned long flags; |
3811 | #ifdef NETIF_F_TSO | ||
3812 | int mss; | ||
3813 | #endif | ||
3814 | u16 vlan_tag = 0; | 3836 | u16 vlan_tag = 0; |
3815 | int vlan_priority = 0; | 3837 | int vlan_priority = 0; |
3816 | mac_info_t *mac_control; | 3838 | mac_info_t *mac_control; |
3817 | struct config_param *config; | 3839 | struct config_param *config; |
3840 | int offload_type; | ||
3818 | 3841 | ||
3819 | mac_control = &sp->mac_control; | 3842 | mac_control = &sp->mac_control; |
3820 | config = &sp->config; | 3843 | config = &sp->config; |
@@ -3862,13 +3885,11 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3862 | return 0; | 3885 | return 0; |
3863 | } | 3886 | } |
3864 | 3887 | ||
3865 | txdp->Control_1 = 0; | 3888 | offload_type = s2io_offload_type(skb); |
3866 | txdp->Control_2 = 0; | ||
3867 | #ifdef NETIF_F_TSO | 3889 | #ifdef NETIF_F_TSO |
3868 | mss = skb_shinfo(skb)->gso_size; | 3890 | if (offload_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { |
3869 | if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { | ||
3870 | txdp->Control_1 |= TXD_TCP_LSO_EN; | 3891 | txdp->Control_1 |= TXD_TCP_LSO_EN; |
3871 | txdp->Control_1 |= TXD_TCP_LSO_MSS(mss); | 3892 | txdp->Control_1 |= TXD_TCP_LSO_MSS(s2io_tcp_mss(skb)); |
3872 | } | 3893 | } |
3873 | #endif | 3894 | #endif |
3874 | if (skb->ip_summed == CHECKSUM_HW) { | 3895 | if (skb->ip_summed == CHECKSUM_HW) { |
@@ -3886,10 +3907,10 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3886 | } | 3907 | } |
3887 | 3908 | ||
3888 | frg_len = skb->len - skb->data_len; | 3909 | frg_len = skb->len - skb->data_len; |
3889 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) { | 3910 | if (offload_type == SKB_GSO_UDP) { |
3890 | int ufo_size; | 3911 | int ufo_size; |
3891 | 3912 | ||
3892 | ufo_size = skb_shinfo(skb)->gso_size; | 3913 | ufo_size = s2io_udp_mss(skb); |
3893 | ufo_size &= ~7; | 3914 | ufo_size &= ~7; |
3894 | txdp->Control_1 |= TXD_UFO_EN; | 3915 | txdp->Control_1 |= TXD_UFO_EN; |
3895 | txdp->Control_1 |= TXD_UFO_MSS(ufo_size); | 3916 | txdp->Control_1 |= TXD_UFO_MSS(ufo_size); |
@@ -3906,16 +3927,13 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3906 | sp->ufo_in_band_v, | 3927 | sp->ufo_in_band_v, |
3907 | sizeof(u64), PCI_DMA_TODEVICE); | 3928 | sizeof(u64), PCI_DMA_TODEVICE); |
3908 | txdp++; | 3929 | txdp++; |
3909 | txdp->Control_1 = 0; | ||
3910 | txdp->Control_2 = 0; | ||
3911 | } | 3930 | } |
3912 | 3931 | ||
3913 | txdp->Buffer_Pointer = pci_map_single | 3932 | txdp->Buffer_Pointer = pci_map_single |
3914 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); | 3933 | (sp->pdev, skb->data, frg_len, PCI_DMA_TODEVICE); |
3915 | txdp->Host_Control = (unsigned long) skb; | 3934 | txdp->Host_Control = (unsigned long) skb; |
3916 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); | 3935 | txdp->Control_1 |= TXD_BUFFER0_SIZE(frg_len); |
3917 | 3936 | if (offload_type == SKB_GSO_UDP) | |
3918 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | ||
3919 | txdp->Control_1 |= TXD_UFO_EN; | 3937 | txdp->Control_1 |= TXD_UFO_EN; |
3920 | 3938 | ||
3921 | frg_cnt = skb_shinfo(skb)->nr_frags; | 3939 | frg_cnt = skb_shinfo(skb)->nr_frags; |
@@ -3930,12 +3948,12 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3930 | (sp->pdev, frag->page, frag->page_offset, | 3948 | (sp->pdev, frag->page, frag->page_offset, |
3931 | frag->size, PCI_DMA_TODEVICE); | 3949 | frag->size, PCI_DMA_TODEVICE); |
3932 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); | 3950 | txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size); |
3933 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | 3951 | if (offload_type == SKB_GSO_UDP) |
3934 | txdp->Control_1 |= TXD_UFO_EN; | 3952 | txdp->Control_1 |= TXD_UFO_EN; |
3935 | } | 3953 | } |
3936 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; | 3954 | txdp->Control_1 |= TXD_GATHER_CODE_LAST; |
3937 | 3955 | ||
3938 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | 3956 | if (offload_type == SKB_GSO_UDP) |
3939 | frg_cnt++; /* as Txd0 was used for inband header */ | 3957 | frg_cnt++; /* as Txd0 was used for inband header */ |
3940 | 3958 | ||
3941 | tx_fifo = mac_control->tx_FIFO_start[queue]; | 3959 | tx_fifo = mac_control->tx_FIFO_start[queue]; |
@@ -3944,13 +3962,9 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3944 | 3962 | ||
3945 | val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | | 3963 | val64 = (TX_FIFO_LAST_TXD_NUM(frg_cnt) | TX_FIFO_FIRST_LIST | |
3946 | TX_FIFO_LAST_LIST); | 3964 | TX_FIFO_LAST_LIST); |
3947 | 3965 | if (offload_type) | |
3948 | #ifdef NETIF_F_TSO | ||
3949 | if (mss) | ||
3950 | val64 |= TX_FIFO_SPECIAL_FUNC; | ||
3951 | #endif | ||
3952 | if (skb_shinfo(skb)->gso_type == SKB_GSO_UDP) | ||
3953 | val64 |= TX_FIFO_SPECIAL_FUNC; | 3966 | val64 |= TX_FIFO_SPECIAL_FUNC; |
3967 | |||
3954 | writeq(val64, &tx_fifo->List_Control); | 3968 | writeq(val64, &tx_fifo->List_Control); |
3955 | 3969 | ||
3956 | mmiowb(); | 3970 | mmiowb(); |
@@ -3984,13 +3998,41 @@ s2io_alarm_handle(unsigned long data) | |||
3984 | mod_timer(&sp->alarm_timer, jiffies + HZ / 2); | 3998 | mod_timer(&sp->alarm_timer, jiffies + HZ / 2); |
3985 | } | 3999 | } |
3986 | 4000 | ||
4001 | static int s2io_chk_rx_buffers(nic_t *sp, int rng_n) | ||
4002 | { | ||
4003 | int rxb_size, level; | ||
4004 | |||
4005 | if (!sp->lro) { | ||
4006 | rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); | ||
4007 | level = rx_buffer_level(sp, rxb_size, rng_n); | ||
4008 | |||
4009 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4010 | int ret; | ||
4011 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); | ||
4012 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4013 | if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { | ||
4014 | DBG_PRINT(ERR_DBG, "Out of memory in %s", | ||
4015 | __FUNCTION__); | ||
4016 | clear_bit(0, (&sp->tasklet_status)); | ||
4017 | return -1; | ||
4018 | } | ||
4019 | clear_bit(0, (&sp->tasklet_status)); | ||
4020 | } else if (level == LOW) | ||
4021 | tasklet_schedule(&sp->task); | ||
4022 | |||
4023 | } else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { | ||
4024 | DBG_PRINT(ERR_DBG, "%s:Out of memory", sp->dev->name); | ||
4025 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4026 | } | ||
4027 | return 0; | ||
4028 | } | ||
4029 | |||
3987 | static irqreturn_t | 4030 | static irqreturn_t |
3988 | s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) | 4031 | s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) |
3989 | { | 4032 | { |
3990 | struct net_device *dev = (struct net_device *) dev_id; | 4033 | struct net_device *dev = (struct net_device *) dev_id; |
3991 | nic_t *sp = dev->priv; | 4034 | nic_t *sp = dev->priv; |
3992 | int i; | 4035 | int i; |
3993 | int ret; | ||
3994 | mac_info_t *mac_control; | 4036 | mac_info_t *mac_control; |
3995 | struct config_param *config; | 4037 | struct config_param *config; |
3996 | 4038 | ||
@@ -4012,35 +4054,8 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs) | |||
4012 | * reallocate the buffers from the interrupt handler itself, | 4054 | * reallocate the buffers from the interrupt handler itself, |
4013 | * else schedule a tasklet to reallocate the buffers. | 4055 | * else schedule a tasklet to reallocate the buffers. |
4014 | */ | 4056 | */ |
4015 | for (i = 0; i < config->rx_ring_num; i++) { | 4057 | for (i = 0; i < config->rx_ring_num; i++) |
4016 | if (!sp->lro) { | 4058 | s2io_chk_rx_buffers(sp, i); |
4017 | int rxb_size = atomic_read(&sp->rx_bufs_left[i]); | ||
4018 | int level = rx_buffer_level(sp, rxb_size, i); | ||
4019 | |||
4020 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4021 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", | ||
4022 | dev->name); | ||
4023 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4024 | if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { | ||
4025 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4026 | dev->name); | ||
4027 | DBG_PRINT(ERR_DBG, " in ISR!!\n"); | ||
4028 | clear_bit(0, (&sp->tasklet_status)); | ||
4029 | atomic_dec(&sp->isr_cnt); | ||
4030 | return IRQ_HANDLED; | ||
4031 | } | ||
4032 | clear_bit(0, (&sp->tasklet_status)); | ||
4033 | } else if (level == LOW) { | ||
4034 | tasklet_schedule(&sp->task); | ||
4035 | } | ||
4036 | } | ||
4037 | else if (fill_rx_buffers(sp, i) == -ENOMEM) { | ||
4038 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4039 | dev->name); | ||
4040 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4041 | break; | ||
4042 | } | ||
4043 | } | ||
4044 | 4059 | ||
4045 | atomic_dec(&sp->isr_cnt); | 4060 | atomic_dec(&sp->isr_cnt); |
4046 | return IRQ_HANDLED; | 4061 | return IRQ_HANDLED; |
@@ -4051,39 +4066,13 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs) | |||
4051 | { | 4066 | { |
4052 | ring_info_t *ring = (ring_info_t *)dev_id; | 4067 | ring_info_t *ring = (ring_info_t *)dev_id; |
4053 | nic_t *sp = ring->nic; | 4068 | nic_t *sp = ring->nic; |
4054 | struct net_device *dev = (struct net_device *) dev_id; | ||
4055 | int rxb_size, level, rng_n; | ||
4056 | 4069 | ||
4057 | atomic_inc(&sp->isr_cnt); | 4070 | atomic_inc(&sp->isr_cnt); |
4058 | rx_intr_handler(ring); | ||
4059 | |||
4060 | rng_n = ring->ring_no; | ||
4061 | if (!sp->lro) { | ||
4062 | rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); | ||
4063 | level = rx_buffer_level(sp, rxb_size, rng_n); | ||
4064 | 4071 | ||
4065 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | 4072 | rx_intr_handler(ring); |
4066 | int ret; | 4073 | s2io_chk_rx_buffers(sp, ring->ring_no); |
4067 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__); | ||
4068 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4069 | if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) { | ||
4070 | DBG_PRINT(ERR_DBG, "Out of memory in %s", | ||
4071 | __FUNCTION__); | ||
4072 | clear_bit(0, (&sp->tasklet_status)); | ||
4073 | return IRQ_HANDLED; | ||
4074 | } | ||
4075 | clear_bit(0, (&sp->tasklet_status)); | ||
4076 | } else if (level == LOW) { | ||
4077 | tasklet_schedule(&sp->task); | ||
4078 | } | ||
4079 | } | ||
4080 | else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) { | ||
4081 | DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name); | ||
4082 | DBG_PRINT(ERR_DBG, " in Rx Intr!!\n"); | ||
4083 | } | ||
4084 | 4074 | ||
4085 | atomic_dec(&sp->isr_cnt); | 4075 | atomic_dec(&sp->isr_cnt); |
4086 | |||
4087 | return IRQ_HANDLED; | 4076 | return IRQ_HANDLED; |
4088 | } | 4077 | } |
4089 | 4078 | ||
@@ -4248,37 +4237,8 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs) | |||
4248 | * else schedule a tasklet to reallocate the buffers. | 4237 | * else schedule a tasklet to reallocate the buffers. |
4249 | */ | 4238 | */ |
4250 | #ifndef CONFIG_S2IO_NAPI | 4239 | #ifndef CONFIG_S2IO_NAPI |
4251 | for (i = 0; i < config->rx_ring_num; i++) { | 4240 | for (i = 0; i < config->rx_ring_num; i++) |
4252 | if (!sp->lro) { | 4241 | s2io_chk_rx_buffers(sp, i); |
4253 | int ret; | ||
4254 | int rxb_size = atomic_read(&sp->rx_bufs_left[i]); | ||
4255 | int level = rx_buffer_level(sp, rxb_size, i); | ||
4256 | |||
4257 | if ((level == PANIC) && (!TASKLET_IN_USE)) { | ||
4258 | DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", | ||
4259 | dev->name); | ||
4260 | DBG_PRINT(INTR_DBG, "PANIC levels\n"); | ||
4261 | if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { | ||
4262 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4263 | dev->name); | ||
4264 | DBG_PRINT(ERR_DBG, " in ISR!!\n"); | ||
4265 | clear_bit(0, (&sp->tasklet_status)); | ||
4266 | atomic_dec(&sp->isr_cnt); | ||
4267 | writeq(org_mask, &bar0->general_int_mask); | ||
4268 | return IRQ_HANDLED; | ||
4269 | } | ||
4270 | clear_bit(0, (&sp->tasklet_status)); | ||
4271 | } else if (level == LOW) { | ||
4272 | tasklet_schedule(&sp->task); | ||
4273 | } | ||
4274 | } | ||
4275 | else if (fill_rx_buffers(sp, i) == -ENOMEM) { | ||
4276 | DBG_PRINT(ERR_DBG, "%s:Out of memory", | ||
4277 | dev->name); | ||
4278 | DBG_PRINT(ERR_DBG, " in Rx intr!!\n"); | ||
4279 | break; | ||
4280 | } | ||
4281 | } | ||
4282 | #endif | 4242 | #endif |
4283 | writeq(org_mask, &bar0->general_int_mask); | 4243 | writeq(org_mask, &bar0->general_int_mask); |
4284 | atomic_dec(&sp->isr_cnt); | 4244 | atomic_dec(&sp->isr_cnt); |
@@ -4308,6 +4268,8 @@ static void s2io_updt_stats(nic_t *sp) | |||
4308 | if (cnt == 5) | 4268 | if (cnt == 5) |
4309 | break; /* Updt failed */ | 4269 | break; /* Updt failed */ |
4310 | } while(1); | 4270 | } while(1); |
4271 | } else { | ||
4272 | memset(sp->mac_control.stats_info, 0, sizeof(StatInfo_t)); | ||
4311 | } | 4273 | } |
4312 | } | 4274 | } |
4313 | 4275 | ||
@@ -4942,7 +4904,8 @@ static int write_eeprom(nic_t * sp, int off, u64 data, int cnt) | |||
4942 | } | 4904 | } |
4943 | static void s2io_vpd_read(nic_t *nic) | 4905 | static void s2io_vpd_read(nic_t *nic) |
4944 | { | 4906 | { |
4945 | u8 vpd_data[256],data; | 4907 | u8 *vpd_data; |
4908 | u8 data; | ||
4946 | int i=0, cnt, fail = 0; | 4909 | int i=0, cnt, fail = 0; |
4947 | int vpd_addr = 0x80; | 4910 | int vpd_addr = 0x80; |
4948 | 4911 | ||
@@ -4955,6 +4918,10 @@ static void s2io_vpd_read(nic_t *nic) | |||
4955 | vpd_addr = 0x50; | 4918 | vpd_addr = 0x50; |
4956 | } | 4919 | } |
4957 | 4920 | ||
4921 | vpd_data = kmalloc(256, GFP_KERNEL); | ||
4922 | if (!vpd_data) | ||
4923 | return; | ||
4924 | |||
4958 | for (i = 0; i < 256; i +=4 ) { | 4925 | for (i = 0; i < 256; i +=4 ) { |
4959 | pci_write_config_byte(nic->pdev, (vpd_addr + 2), i); | 4926 | pci_write_config_byte(nic->pdev, (vpd_addr + 2), i); |
4960 | pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data); | 4927 | pci_read_config_byte(nic->pdev, (vpd_addr + 2), &data); |
@@ -4977,6 +4944,7 @@ static void s2io_vpd_read(nic_t *nic) | |||
4977 | memset(nic->product_name, 0, vpd_data[1]); | 4944 | memset(nic->product_name, 0, vpd_data[1]); |
4978 | memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); | 4945 | memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); |
4979 | } | 4946 | } |
4947 | kfree(vpd_data); | ||
4980 | } | 4948 | } |
4981 | 4949 | ||
4982 | /** | 4950 | /** |
@@ -5295,7 +5263,7 @@ static int s2io_link_test(nic_t * sp, uint64_t * data) | |||
5295 | else | 5263 | else |
5296 | *data = 0; | 5264 | *data = 0; |
5297 | 5265 | ||
5298 | return 0; | 5266 | return *data; |
5299 | } | 5267 | } |
5300 | 5268 | ||
5301 | /** | 5269 | /** |
@@ -5753,6 +5721,19 @@ static int s2io_ethtool_op_set_tx_csum(struct net_device *dev, u32 data) | |||
5753 | return 0; | 5721 | return 0; |
5754 | } | 5722 | } |
5755 | 5723 | ||
5724 | static u32 s2io_ethtool_op_get_tso(struct net_device *dev) | ||
5725 | { | ||
5726 | return (dev->features & NETIF_F_TSO) != 0; | ||
5727 | } | ||
5728 | static int s2io_ethtool_op_set_tso(struct net_device *dev, u32 data) | ||
5729 | { | ||
5730 | if (data) | ||
5731 | dev->features |= (NETIF_F_TSO | NETIF_F_TSO6); | ||
5732 | else | ||
5733 | dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6); | ||
5734 | |||
5735 | return 0; | ||
5736 | } | ||
5756 | 5737 | ||
5757 | static struct ethtool_ops netdev_ethtool_ops = { | 5738 | static struct ethtool_ops netdev_ethtool_ops = { |
5758 | .get_settings = s2io_ethtool_gset, | 5739 | .get_settings = s2io_ethtool_gset, |
@@ -5773,8 +5754,8 @@ static struct ethtool_ops netdev_ethtool_ops = { | |||
5773 | .get_sg = ethtool_op_get_sg, | 5754 | .get_sg = ethtool_op_get_sg, |
5774 | .set_sg = ethtool_op_set_sg, | 5755 | .set_sg = ethtool_op_set_sg, |
5775 | #ifdef NETIF_F_TSO | 5756 | #ifdef NETIF_F_TSO |
5776 | .get_tso = ethtool_op_get_tso, | 5757 | .get_tso = s2io_ethtool_op_get_tso, |
5777 | .set_tso = ethtool_op_set_tso, | 5758 | .set_tso = s2io_ethtool_op_set_tso, |
5778 | #endif | 5759 | #endif |
5779 | .get_ufo = ethtool_op_get_ufo, | 5760 | .get_ufo = ethtool_op_get_ufo, |
5780 | .set_ufo = ethtool_op_set_ufo, | 5761 | .set_ufo = ethtool_op_set_ufo, |
@@ -6337,7 +6318,7 @@ static int s2io_card_up(nic_t * sp) | |||
6337 | s2io_set_multicast(dev); | 6318 | s2io_set_multicast(dev); |
6338 | 6319 | ||
6339 | if (sp->lro) { | 6320 | if (sp->lro) { |
6340 | /* Initialize max aggregatable pkts based on MTU */ | 6321 | /* Initialize max aggregatable pkts per session based on MTU */ |
6341 | sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu; | 6322 | sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu; |
6342 | /* Check if we can use(if specified) user provided value */ | 6323 | /* Check if we can use(if specified) user provided value */ |
6343 | if (lro_max_pkts < sp->lro_max_aggr_per_sess) | 6324 | if (lro_max_pkts < sp->lro_max_aggr_per_sess) |
@@ -6438,7 +6419,7 @@ static void s2io_tx_watchdog(struct net_device *dev) | |||
6438 | * @cksum : FCS checksum of the frame. | 6419 | * @cksum : FCS checksum of the frame. |
6439 | * @ring_no : the ring from which this RxD was extracted. | 6420 | * @ring_no : the ring from which this RxD was extracted. |
6440 | * Description: | 6421 | * Description: |
6441 | * This function is called by the Tx interrupt serivce routine to perform | 6422 | * This function is called by the Rx interrupt serivce routine to perform |
6442 | * some OS related operations on the SKB before passing it to the upper | 6423 | * some OS related operations on the SKB before passing it to the upper |
6443 | * layers. It mainly checks if the checksum is OK, if so adds it to the | 6424 | * layers. It mainly checks if the checksum is OK, if so adds it to the |
6444 | * SKBs cksum variable, increments the Rx packet count and passes the SKB | 6425 | * SKBs cksum variable, increments the Rx packet count and passes the SKB |
@@ -6698,33 +6679,6 @@ static void s2io_init_pci(nic_t * sp) | |||
6698 | pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); | 6679 | pci_read_config_word(sp->pdev, PCI_COMMAND, &pci_cmd); |
6699 | } | 6680 | } |
6700 | 6681 | ||
6701 | MODULE_AUTHOR("Raghavendra Koushik <raghavendra.koushik@neterion.com>"); | ||
6702 | MODULE_LICENSE("GPL"); | ||
6703 | MODULE_VERSION(DRV_VERSION); | ||
6704 | |||
6705 | module_param(tx_fifo_num, int, 0); | ||
6706 | module_param(rx_ring_num, int, 0); | ||
6707 | module_param(rx_ring_mode, int, 0); | ||
6708 | module_param_array(tx_fifo_len, uint, NULL, 0); | ||
6709 | module_param_array(rx_ring_sz, uint, NULL, 0); | ||
6710 | module_param_array(rts_frm_len, uint, NULL, 0); | ||
6711 | module_param(use_continuous_tx_intrs, int, 1); | ||
6712 | module_param(rmac_pause_time, int, 0); | ||
6713 | module_param(mc_pause_threshold_q0q3, int, 0); | ||
6714 | module_param(mc_pause_threshold_q4q7, int, 0); | ||
6715 | module_param(shared_splits, int, 0); | ||
6716 | module_param(tmac_util_period, int, 0); | ||
6717 | module_param(rmac_util_period, int, 0); | ||
6718 | module_param(bimodal, bool, 0); | ||
6719 | module_param(l3l4hdr_size, int , 0); | ||
6720 | #ifndef CONFIG_S2IO_NAPI | ||
6721 | module_param(indicate_max_pkts, int, 0); | ||
6722 | #endif | ||
6723 | module_param(rxsync_frequency, int, 0); | ||
6724 | module_param(intr_type, int, 0); | ||
6725 | module_param(lro, int, 0); | ||
6726 | module_param(lro_max_pkts, int, 0); | ||
6727 | |||
6728 | static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type) | 6682 | static int s2io_verify_parm(struct pci_dev *pdev, u8 *dev_intr_type) |
6729 | { | 6683 | { |
6730 | if ( tx_fifo_num > 8) { | 6684 | if ( tx_fifo_num > 8) { |
@@ -6832,8 +6786,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
6832 | } | 6786 | } |
6833 | if (dev_intr_type != MSI_X) { | 6787 | if (dev_intr_type != MSI_X) { |
6834 | if (pci_request_regions(pdev, s2io_driver_name)) { | 6788 | if (pci_request_regions(pdev, s2io_driver_name)) { |
6835 | DBG_PRINT(ERR_DBG, "Request Regions failed\n"), | 6789 | DBG_PRINT(ERR_DBG, "Request Regions failed\n"); |
6836 | pci_disable_device(pdev); | 6790 | pci_disable_device(pdev); |
6837 | return -ENODEV; | 6791 | return -ENODEV; |
6838 | } | 6792 | } |
6839 | } | 6793 | } |
@@ -6957,7 +6911,7 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
6957 | /* initialize the shared memory used by the NIC and the host */ | 6911 | /* initialize the shared memory used by the NIC and the host */ |
6958 | if (init_shared_mem(sp)) { | 6912 | if (init_shared_mem(sp)) { |
6959 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", | 6913 | DBG_PRINT(ERR_DBG, "%s: Memory allocation failed\n", |
6960 | __FUNCTION__); | 6914 | dev->name); |
6961 | ret = -ENOMEM; | 6915 | ret = -ENOMEM; |
6962 | goto mem_alloc_failed; | 6916 | goto mem_alloc_failed; |
6963 | } | 6917 | } |
@@ -7094,6 +7048,9 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7094 | dev->addr_len = ETH_ALEN; | 7048 | dev->addr_len = ETH_ALEN; |
7095 | memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); | 7049 | memcpy(dev->dev_addr, sp->def_mac_addr, ETH_ALEN); |
7096 | 7050 | ||
7051 | /* reset Nic and bring it to known state */ | ||
7052 | s2io_reset(sp); | ||
7053 | |||
7097 | /* | 7054 | /* |
7098 | * Initialize the tasklet status and link state flags | 7055 | * Initialize the tasklet status and link state flags |
7099 | * and the card state parameter | 7056 | * and the card state parameter |
@@ -7131,11 +7088,11 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7131 | goto register_failed; | 7088 | goto register_failed; |
7132 | } | 7089 | } |
7133 | s2io_vpd_read(sp); | 7090 | s2io_vpd_read(sp); |
7134 | DBG_PRINT(ERR_DBG, "%s: Neterion %s",dev->name, sp->product_name); | ||
7135 | DBG_PRINT(ERR_DBG, "(rev %d), Driver version %s\n", | ||
7136 | get_xena_rev_id(sp->pdev), | ||
7137 | s2io_driver_version); | ||
7138 | DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); | 7091 | DBG_PRINT(ERR_DBG, "Copyright(c) 2002-2005 Neterion Inc.\n"); |
7092 | DBG_PRINT(ERR_DBG, "%s: Neterion %s (rev %d)\n",dev->name, | ||
7093 | sp->product_name, get_xena_rev_id(sp->pdev)); | ||
7094 | DBG_PRINT(ERR_DBG, "%s: Driver version %s\n", dev->name, | ||
7095 | s2io_driver_version); | ||
7139 | DBG_PRINT(ERR_DBG, "%s: MAC ADDR: " | 7096 | DBG_PRINT(ERR_DBG, "%s: MAC ADDR: " |
7140 | "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, | 7097 | "%02x:%02x:%02x:%02x:%02x:%02x\n", dev->name, |
7141 | sp->def_mac_addr[0].mac_addr[0], | 7098 | sp->def_mac_addr[0].mac_addr[0], |
@@ -7436,8 +7393,13 @@ static int verify_l3_l4_lro_capable(lro_t *l_lro, struct iphdr *ip, | |||
7436 | if (ip->ihl != 5) /* IP has options */ | 7393 | if (ip->ihl != 5) /* IP has options */ |
7437 | return -1; | 7394 | return -1; |
7438 | 7395 | ||
7396 | /* If we see CE codepoint in IP header, packet is not mergeable */ | ||
7397 | if (INET_ECN_is_ce(ipv4_get_dsfield(ip))) | ||
7398 | return -1; | ||
7399 | |||
7400 | /* If we see ECE or CWR flags in TCP header, packet is not mergeable */ | ||
7439 | if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin || | 7401 | if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin || |
7440 | !tcp->ack) { | 7402 | tcp->ece || tcp->cwr || !tcp->ack) { |
7441 | /* | 7403 | /* |
7442 | * Currently recognize only the ack control word and | 7404 | * Currently recognize only the ack control word and |
7443 | * any other control field being set would result in | 7405 | * any other control field being set would result in |
@@ -7591,18 +7553,16 @@ static void queue_rx_frame(struct sk_buff *skb) | |||
7591 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, | 7553 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, |
7592 | u32 tcp_len) | 7554 | u32 tcp_len) |
7593 | { | 7555 | { |
7594 | struct sk_buff *tmp, *first = lro->parent; | 7556 | struct sk_buff *first = lro->parent; |
7595 | 7557 | ||
7596 | first->len += tcp_len; | 7558 | first->len += tcp_len; |
7597 | first->data_len = lro->frags_len; | 7559 | first->data_len = lro->frags_len; |
7598 | skb_pull(skb, (skb->len - tcp_len)); | 7560 | skb_pull(skb, (skb->len - tcp_len)); |
7599 | if ((tmp = skb_shinfo(first)->frag_list)) { | 7561 | if (skb_shinfo(first)->frag_list) |
7600 | while (tmp->next) | 7562 | lro->last_frag->next = skb; |
7601 | tmp = tmp->next; | ||
7602 | tmp->next = skb; | ||
7603 | } | ||
7604 | else | 7563 | else |
7605 | skb_shinfo(first)->frag_list = skb; | 7564 | skb_shinfo(first)->frag_list = skb; |
7565 | lro->last_frag = skb; | ||
7606 | sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++; | 7566 | sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++; |
7607 | return; | 7567 | return; |
7608 | } | 7568 | } |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index 217097bc22f1..5ed49c3be1e9 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
@@ -719,6 +719,7 @@ struct msix_info_st { | |||
719 | /* Data structure to represent a LRO session */ | 719 | /* Data structure to represent a LRO session */ |
720 | typedef struct lro { | 720 | typedef struct lro { |
721 | struct sk_buff *parent; | 721 | struct sk_buff *parent; |
722 | struct sk_buff *last_frag; | ||
722 | u8 *l2h; | 723 | u8 *l2h; |
723 | struct iphdr *iph; | 724 | struct iphdr *iph; |
724 | struct tcphdr *tcph; | 725 | struct tcphdr *tcph; |
@@ -1011,4 +1012,13 @@ static void clear_lro_session(lro_t *lro); | |||
1011 | static void queue_rx_frame(struct sk_buff *skb); | 1012 | static void queue_rx_frame(struct sk_buff *skb); |
1012 | static void update_L3L4_header(nic_t *sp, lro_t *lro); | 1013 | static void update_L3L4_header(nic_t *sp, lro_t *lro); |
1013 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len); | 1014 | static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len); |
1015 | |||
1016 | #define s2io_tcp_mss(skb) skb_shinfo(skb)->gso_size | ||
1017 | #define s2io_udp_mss(skb) skb_shinfo(skb)->gso_size | ||
1018 | #define s2io_offload_type(skb) skb_shinfo(skb)->gso_type | ||
1019 | |||
1020 | #define S2IO_PARM_INT(X, def_val) \ | ||
1021 | static unsigned int X = def_val;\ | ||
1022 | module_param(X , uint, 0); | ||
1023 | |||
1014 | #endif /* _S2IO_H */ | 1024 | #endif /* _S2IO_H */ |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 1b8138f641e3..6f97962dd06b 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -68,8 +68,8 @@ | |||
68 | 68 | ||
69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
71 | #define DRV_MODULE_VERSION "3.63" | 71 | #define DRV_MODULE_VERSION "3.64" |
72 | #define DRV_MODULE_RELDATE "July 25, 2006" | 72 | #define DRV_MODULE_RELDATE "July 31, 2006" |
73 | 73 | ||
74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
@@ -3097,7 +3097,7 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, | |||
3097 | * Callers depend upon this behavior and assume that | 3097 | * Callers depend upon this behavior and assume that |
3098 | * we leave everything unchanged if we fail. | 3098 | * we leave everything unchanged if we fail. |
3099 | */ | 3099 | */ |
3100 | skb = dev_alloc_skb(skb_size); | 3100 | skb = netdev_alloc_skb(tp->dev, skb_size); |
3101 | if (skb == NULL) | 3101 | if (skb == NULL) |
3102 | return -ENOMEM; | 3102 | return -ENOMEM; |
3103 | 3103 | ||
@@ -3270,7 +3270,7 @@ static int tg3_rx(struct tg3 *tp, int budget) | |||
3270 | tg3_recycle_rx(tp, opaque_key, | 3270 | tg3_recycle_rx(tp, opaque_key, |
3271 | desc_idx, *post_ptr); | 3271 | desc_idx, *post_ptr); |
3272 | 3272 | ||
3273 | copy_skb = dev_alloc_skb(len + 2); | 3273 | copy_skb = netdev_alloc_skb(tp->dev, len + 2); |
3274 | if (copy_skb == NULL) | 3274 | if (copy_skb == NULL) |
3275 | goto drop_it_no_recycle; | 3275 | goto drop_it_no_recycle; |
3276 | 3276 | ||
@@ -8618,7 +8618,7 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8618 | err = -EIO; | 8618 | err = -EIO; |
8619 | 8619 | ||
8620 | tx_len = 1514; | 8620 | tx_len = 1514; |
8621 | skb = dev_alloc_skb(tx_len); | 8621 | skb = netdev_alloc_skb(tp->dev, tx_len); |
8622 | if (!skb) | 8622 | if (!skb) |
8623 | return -ENOMEM; | 8623 | return -ENOMEM; |
8624 | 8624 | ||
diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index 34de5697983d..e2fef60c2d06 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c | |||
@@ -27,8 +27,7 @@ | |||
27 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | * | 29 | * |
30 | * Send feedback to <gregkh@us.ibm.com>, | 30 | * Send feedback to <kristen.c.accardi@intel.com> |
31 | * <t-kochi@bq.jp.nec.com> | ||
32 | * | 31 | * |
33 | */ | 32 | */ |
34 | 33 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index ef95d12fb32c..ae67a8f55ba1 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -26,7 +26,7 @@ | |||
26 | * along with this program; if not, write to the Free Software | 26 | * along with this program; if not, write to the Free Software |
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | * | 28 | * |
29 | * Send feedback to <t-kochi@bq.jp.nec.com> | 29 | * Send feedback to <kristen.c.accardi@intel.com> |
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 50bfc1b2f3bf..478d0d28f7ad 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
@@ -30,23 +30,6 @@ MODULE_LICENSE("GPL"); | |||
30 | /* global data */ | 30 | /* global data */ |
31 | static const char device_name[] = "pcieport-driver"; | 31 | static const char device_name[] = "pcieport-driver"; |
32 | 32 | ||
33 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
34 | { | ||
35 | return pci_save_state(dev); | ||
36 | } | ||
37 | |||
38 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
39 | { | ||
40 | int retval; | ||
41 | |||
42 | pci_restore_state(dev); | ||
43 | retval = pci_enable_device(dev); | ||
44 | if (retval) | ||
45 | return retval; | ||
46 | pci_set_master(dev); | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | /* | 33 | /* |
51 | * pcie_portdrv_probe - Probe PCI-Express port devices | 34 | * pcie_portdrv_probe - Probe PCI-Express port devices |
52 | * @dev: PCI-Express port device being probed | 35 | * @dev: PCI-Express port device being probed |
@@ -73,8 +56,10 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, | |||
73 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", | 56 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", |
74 | __FUNCTION__, dev->device, dev->vendor); | 57 | __FUNCTION__, dev->device, dev->vendor); |
75 | } | 58 | } |
76 | if (pcie_port_device_register(dev)) | 59 | if (pcie_port_device_register(dev)) { |
60 | pci_disable_device(dev); | ||
77 | return -ENOMEM; | 61 | return -ENOMEM; |
62 | } | ||
78 | 63 | ||
79 | return 0; | 64 | return 0; |
80 | } | 65 | } |
@@ -86,6 +71,23 @@ static void pcie_portdrv_remove (struct pci_dev *dev) | |||
86 | } | 71 | } |
87 | 72 | ||
88 | #ifdef CONFIG_PM | 73 | #ifdef CONFIG_PM |
74 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
75 | { | ||
76 | return pci_save_state(dev); | ||
77 | } | ||
78 | |||
79 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
80 | { | ||
81 | int retval; | ||
82 | |||
83 | pci_restore_state(dev); | ||
84 | retval = pci_enable_device(dev); | ||
85 | if (retval) | ||
86 | return retval; | ||
87 | pci_set_master(dev); | ||
88 | return 0; | ||
89 | } | ||
90 | |||
89 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) | 91 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) |
90 | { | 92 | { |
91 | int ret = pcie_port_device_suspend(dev, state); | 93 | int ret = pcie_port_device_suspend(dev, state); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e3c78c39b7e4..fb08bc951ac0 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -990,6 +990,11 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
990 | case 0x8070: /* P4G8X Deluxe */ | 990 | case 0x8070: /* P4G8X Deluxe */ |
991 | asus_hides_smbus = 1; | 991 | asus_hides_smbus = 1; |
992 | } | 992 | } |
993 | if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH) | ||
994 | switch (dev->subsystem_device) { | ||
995 | case 0x80c9: /* PU-DLS */ | ||
996 | asus_hides_smbus = 1; | ||
997 | } | ||
993 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | 998 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) |
994 | switch (dev->subsystem_device) { | 999 | switch (dev->subsystem_device) { |
995 | case 0x1751: /* M2N notebook */ | 1000 | case 0x1751: /* M2N notebook */ |
@@ -1058,6 +1063,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asu | |||
1058 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); | 1063 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); |
1059 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); | 1064 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); |
1060 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); | 1065 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); |
1066 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7501_MCH, asus_hides_smbus_hostbridge ); | ||
1061 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); | 1067 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); |
1062 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); | 1068 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); |
1063 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); | 1069 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); |
@@ -1081,6 +1087,7 @@ static void __init asus_hides_smbus_lpc(struct pci_dev *dev) | |||
1081 | } | 1087 | } |
1082 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1088 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
1083 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1089 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
1090 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | ||
1084 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1091 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
1085 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1092 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
1086 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1093 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index f8ae2b7db0a7..d529462d1b53 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
@@ -41,7 +41,7 @@ pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) | |||
41 | * in the global list of PCI buses. If the bus is found, a pointer to its | 41 | * in the global list of PCI buses. If the bus is found, a pointer to its |
42 | * data structure is returned. If no bus is found, %NULL is returned. | 42 | * data structure is returned. If no bus is found, %NULL is returned. |
43 | */ | 43 | */ |
44 | struct pci_bus * __devinit pci_find_bus(int domain, int busnr) | 44 | struct pci_bus * pci_find_bus(int domain, int busnr) |
45 | { | 45 | { |
46 | struct pci_bus *bus = NULL; | 46 | struct pci_bus *bus = NULL; |
47 | struct pci_bus *tmp_bus; | 47 | struct pci_bus *tmp_bus; |
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 3163e3d73da1..9d8b415eca79 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
@@ -265,8 +265,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
265 | pnp_printf(buffer," disabled\n"); | 265 | pnp_printf(buffer," disabled\n"); |
266 | else | 266 | else |
267 | pnp_printf(buffer," 0x%llx-0x%llx\n", | 267 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
268 | pnp_port_start(dev, i), | 268 | (unsigned long long)pnp_port_start(dev, i), |
269 | pnp_port_end(dev, i)); | 269 | (unsigned long long)pnp_port_end(dev, i)); |
270 | } | 270 | } |
271 | } | 271 | } |
272 | for (i = 0; i < PNP_MAX_MEM; i++) { | 272 | for (i = 0; i < PNP_MAX_MEM; i++) { |
@@ -276,8 +276,8 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
276 | pnp_printf(buffer," disabled\n"); | 276 | pnp_printf(buffer," disabled\n"); |
277 | else | 277 | else |
278 | pnp_printf(buffer," 0x%llx-0x%llx\n", | 278 | pnp_printf(buffer," 0x%llx-0x%llx\n", |
279 | pnp_mem_start(dev, i), | 279 | (unsigned long long)pnp_mem_start(dev, i), |
280 | pnp_mem_end(dev, i)); | 280 | (unsigned long long)pnp_mem_end(dev, i)); |
281 | } | 281 | } |
282 | } | 282 | } |
283 | for (i = 0; i < PNP_MAX_IRQ; i++) { | 283 | for (i = 0; i < PNP_MAX_IRQ; i++) { |
@@ -287,7 +287,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
287 | pnp_printf(buffer," disabled\n"); | 287 | pnp_printf(buffer," disabled\n"); |
288 | else | 288 | else |
289 | pnp_printf(buffer," %lld\n", | 289 | pnp_printf(buffer," %lld\n", |
290 | pnp_irq(dev, i)); | 290 | (unsigned long long)pnp_irq(dev, i)); |
291 | } | 291 | } |
292 | } | 292 | } |
293 | for (i = 0; i < PNP_MAX_DMA; i++) { | 293 | for (i = 0; i < PNP_MAX_DMA; i++) { |
@@ -297,7 +297,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, struct device_at | |||
297 | pnp_printf(buffer," disabled\n"); | 297 | pnp_printf(buffer," disabled\n"); |
298 | else | 298 | else |
299 | pnp_printf(buffer," %lld\n", | 299 | pnp_printf(buffer," %lld\n", |
300 | pnp_dma(dev, i)); | 300 | (unsigned long long)pnp_dma(dev, i)); |
301 | } | 301 | } |
302 | } | 302 | } |
303 | ret = (buffer->curr - buf); | 303 | ret = (buffer->curr - buf); |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 77e7202a0eba..904c25fb4ba4 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
@@ -940,14 +940,8 @@ static void ahci_host_intr(struct ata_port *ap) | |||
940 | return; | 940 | return; |
941 | 941 | ||
942 | /* ignore interim PIO setup fis interrupts */ | 942 | /* ignore interim PIO setup fis interrupts */ |
943 | if (ata_tag_valid(ap->active_tag)) { | 943 | if (ata_tag_valid(ap->active_tag) && (status & PORT_IRQ_PIOS_FIS)) |
944 | struct ata_queued_cmd *qc = | 944 | return; |
945 | ata_qc_from_tag(ap, ap->active_tag); | ||
946 | |||
947 | if (qc && qc->tf.protocol == ATA_PROT_PIO && | ||
948 | (status & PORT_IRQ_PIOS_FIS)) | ||
949 | return; | ||
950 | } | ||
951 | 945 | ||
952 | if (ata_ratelimit()) | 946 | if (ata_ratelimit()) |
953 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " | 947 | ata_port_printk(ap, KERN_INFO, "spurious interrupt " |
diff --git a/drivers/scsi/aic7xxx/aicasm/Makefile b/drivers/scsi/aic7xxx/aicasm/Makefile index 8c91fda6482c..b98c5c1056c3 100644 --- a/drivers/scsi/aic7xxx/aicasm/Makefile +++ b/drivers/scsi/aic7xxx/aicasm/Makefile | |||
@@ -14,6 +14,8 @@ LIBS= -ldb | |||
14 | clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG) | 14 | clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG) |
15 | # Override default kernel CFLAGS. This is a userland app. | 15 | # Override default kernel CFLAGS. This is a userland app. |
16 | AICASM_CFLAGS:= -I/usr/include -I. | 16 | AICASM_CFLAGS:= -I/usr/include -I. |
17 | LEX= flex | ||
18 | YACC= bison | ||
17 | YFLAGS= -d | 19 | YFLAGS= -d |
18 | 20 | ||
19 | NOMAN= noman | 21 | NOMAN= noman |
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 2ee742d40c43..005043197527 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig | |||
@@ -24,7 +24,7 @@ config USB_ARCH_HAS_OHCI | |||
24 | default y if ARCH_S3C2410 | 24 | default y if ARCH_S3C2410 |
25 | default y if PXA27x | 25 | default y if PXA27x |
26 | default y if ARCH_EP93XX | 26 | default y if ARCH_EP93XX |
27 | default y if ARCH_AT91RM9200 | 27 | default y if (ARCH_AT91RM9200 || ARCH_AT91SAM9261) |
28 | # PPC: | 28 | # PPC: |
29 | default y if STB03xxx | 29 | default y if STB03xxx |
30 | default y if PPC_MPC52xx | 30 | default y if PPC_MPC52xx |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index f7bdd94b3aa8..218621b9958e 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -517,19 +517,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig | |||
517 | 517 | ||
518 | static struct usb_device *usbdev_lookup_minor(int minor) | 518 | static struct usb_device *usbdev_lookup_minor(int minor) |
519 | { | 519 | { |
520 | struct device *device; | 520 | struct class_device *class_dev; |
521 | struct usb_device *udev = NULL; | 521 | struct usb_device *dev = NULL; |
522 | 522 | ||
523 | down(&usb_device_class->sem); | 523 | down(&usb_device_class->sem); |
524 | list_for_each_entry(device, &usb_device_class->devices, node) { | 524 | list_for_each_entry(class_dev, &usb_device_class->children, node) { |
525 | if (device->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { | 525 | if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { |
526 | udev = device->platform_data; | 526 | dev = class_dev->class_data; |
527 | break; | 527 | break; |
528 | } | 528 | } |
529 | } | 529 | } |
530 | up(&usb_device_class->sem); | 530 | up(&usb_device_class->sem); |
531 | 531 | ||
532 | return udev; | 532 | return dev; |
533 | }; | 533 | }; |
534 | 534 | ||
535 | /* | 535 | /* |
@@ -1580,16 +1580,16 @@ static void usbdev_add(struct usb_device *dev) | |||
1580 | { | 1580 | { |
1581 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); | 1581 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); |
1582 | 1582 | ||
1583 | dev->usbfs_dev = device_create(usb_device_class, &dev->dev, | 1583 | dev->class_dev = class_device_create(usb_device_class, NULL, |
1584 | MKDEV(USB_DEVICE_MAJOR, minor), | 1584 | MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev, |
1585 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); | 1585 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); |
1586 | 1586 | ||
1587 | dev->usbfs_dev->platform_data = dev; | 1587 | dev->class_dev->class_data = dev; |
1588 | } | 1588 | } |
1589 | 1589 | ||
1590 | static void usbdev_remove(struct usb_device *dev) | 1590 | static void usbdev_remove(struct usb_device *dev) |
1591 | { | 1591 | { |
1592 | device_unregister(dev->usbfs_dev); | 1592 | class_device_unregister(dev->class_dev); |
1593 | } | 1593 | } |
1594 | 1594 | ||
1595 | static int usbdev_notify(struct notifier_block *self, unsigned long action, | 1595 | static int usbdev_notify(struct notifier_block *self, unsigned long action, |
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index abee0f5b6a66..8de4f8c99d61 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c | |||
@@ -194,13 +194,14 @@ int usb_register_dev(struct usb_interface *intf, | |||
194 | ++temp; | 194 | ++temp; |
195 | else | 195 | else |
196 | temp = name; | 196 | temp = name; |
197 | intf->usb_dev = device_create(usb_class->class, &intf->dev, | 197 | intf->class_dev = class_device_create(usb_class->class, NULL, |
198 | MKDEV(USB_MAJOR, minor), "%s", temp); | 198 | MKDEV(USB_MAJOR, minor), |
199 | if (IS_ERR(intf->usb_dev)) { | 199 | &intf->dev, "%s", temp); |
200 | if (IS_ERR(intf->class_dev)) { | ||
200 | spin_lock (&minor_lock); | 201 | spin_lock (&minor_lock); |
201 | usb_minors[intf->minor] = NULL; | 202 | usb_minors[intf->minor] = NULL; |
202 | spin_unlock (&minor_lock); | 203 | spin_unlock (&minor_lock); |
203 | retval = PTR_ERR(intf->usb_dev); | 204 | retval = PTR_ERR(intf->class_dev); |
204 | } | 205 | } |
205 | exit: | 206 | exit: |
206 | return retval; | 207 | return retval; |
@@ -241,8 +242,8 @@ void usb_deregister_dev(struct usb_interface *intf, | |||
241 | spin_unlock (&minor_lock); | 242 | spin_unlock (&minor_lock); |
242 | 243 | ||
243 | snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); | 244 | snprintf(name, BUS_ID_SIZE, class_driver->name, intf->minor - minor_base); |
244 | device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); | 245 | class_device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); |
245 | intf->usb_dev = NULL; | 246 | intf->class_dev = NULL; |
246 | intf->minor = -1; | 247 | intf->minor = -1; |
247 | destroy_usb_class(); | 248 | destroy_usb_class(); |
248 | } | 249 | } |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 363b2ad74ae6..1a32d96774b4 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -207,7 +207,7 @@ config USB_AT91 | |||
207 | 207 | ||
208 | config USB_GADGET_DUMMY_HCD | 208 | config USB_GADGET_DUMMY_HCD |
209 | boolean "Dummy HCD (DEVELOPMENT)" | 209 | boolean "Dummy HCD (DEVELOPMENT)" |
210 | depends on USB && EXPERIMENTAL | 210 | depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL |
211 | select USB_GADGET_DUALSPEED | 211 | select USB_GADGET_DUALSPEED |
212 | help | 212 | help |
213 | This host controller driver emulates USB, looping all data transfer | 213 | This host controller driver emulates USB, looping all data transfer |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 1c459ff037ce..cfebca05ead5 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -57,19 +57,23 @@ | |||
57 | 57 | ||
58 | /* | 58 | /* |
59 | * This controller is simple and PIO-only. It's used in many AT91-series | 59 | * This controller is simple and PIO-only. It's used in many AT91-series |
60 | * ARMv4T controllers, including the at91rm9200 (arm920T, with MMU), | 60 | * full speed USB controllers, including the at91rm9200 (arm920T, with MMU), |
61 | * at91sam9261 (arm926ejs, with MMU), and several no-mmu versions. | 61 | * at91sam926x (arm926ejs, with MMU), and several no-mmu versions. |
62 | * | 62 | * |
63 | * This driver expects the board has been wired with two GPIOs suppporting | 63 | * This driver expects the board has been wired with two GPIOs suppporting |
64 | * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the | 64 | * a VBUS sensing IRQ, and a D+ pullup. (They may be omitted, but the |
65 | * testing hasn't covered such cases.) The pullup is most important; it | 65 | * testing hasn't covered such cases.) |
66 | * | ||
67 | * The pullup is most important (so it's integrated on sam926x parts). It | ||
66 | * provides software control over whether the host enumerates the device. | 68 | * provides software control over whether the host enumerates the device. |
69 | * | ||
67 | * The VBUS sensing helps during enumeration, and allows both USB clocks | 70 | * The VBUS sensing helps during enumeration, and allows both USB clocks |
68 | * (and the transceiver) to stay gated off until they're necessary, saving | 71 | * (and the transceiver) to stay gated off until they're necessary, saving |
69 | * power. During USB suspend, the 48 MHz clock is gated off. | 72 | * power. During USB suspend, the 48 MHz clock is gated off in hardware; |
73 | * it may also be gated off by software during some Linux sleep states. | ||
70 | */ | 74 | */ |
71 | 75 | ||
72 | #define DRIVER_VERSION "8 March 2005" | 76 | #define DRIVER_VERSION "3 May 2006" |
73 | 77 | ||
74 | static const char driver_name [] = "at91_udc"; | 78 | static const char driver_name [] = "at91_udc"; |
75 | static const char ep0name[] = "ep0"; | 79 | static const char ep0name[] = "ep0"; |
@@ -316,9 +320,15 @@ static void done(struct at91_ep *ep, struct at91_request *req, int status) | |||
316 | * | 320 | * |
317 | * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE | 321 | * There are also state bits like FORCESTALL, EPEDS, DIR, and EPTYPE |
318 | * that shouldn't normally be changed. | 322 | * that shouldn't normally be changed. |
323 | * | ||
324 | * NOTE at91sam9260 docs mention synch between UDPCK and MCK clock domains, | ||
325 | * implying a need to wait for one write to complete (test relevant bits) | ||
326 | * before starting the next write. This shouldn't be an issue given how | ||
327 | * infrequently we write, except maybe for write-then-read idioms. | ||
319 | */ | 328 | */ |
320 | #define SET_FX (AT91_UDP_TXPKTRDY) | 329 | #define SET_FX (AT91_UDP_TXPKTRDY) |
321 | #define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) | 330 | #define CLR_FX (RX_DATA_READY | AT91_UDP_RXSETUP \ |
331 | | AT91_UDP_STALLSENT | AT91_UDP_TXCOMP) | ||
322 | 332 | ||
323 | /* pull OUT packet data from the endpoint's fifo */ | 333 | /* pull OUT packet data from the endpoint's fifo */ |
324 | static int read_fifo (struct at91_ep *ep, struct at91_request *req) | 334 | static int read_fifo (struct at91_ep *ep, struct at91_request *req) |
@@ -472,7 +482,8 @@ static void nuke(struct at91_ep *ep, int status) | |||
472 | 482 | ||
473 | /*-------------------------------------------------------------------------*/ | 483 | /*-------------------------------------------------------------------------*/ |
474 | 484 | ||
475 | static int at91_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | 485 | static int at91_ep_enable(struct usb_ep *_ep, |
486 | const struct usb_endpoint_descriptor *desc) | ||
476 | { | 487 | { |
477 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); | 488 | struct at91_ep *ep = container_of(_ep, struct at91_ep, ep); |
478 | struct at91_udc *dev = ep->udc; | 489 | struct at91_udc *dev = ep->udc; |
@@ -582,11 +593,12 @@ static int at91_ep_disable (struct usb_ep * _ep) | |||
582 | * interesting for request or buffer allocation. | 593 | * interesting for request or buffer allocation. |
583 | */ | 594 | */ |
584 | 595 | ||
585 | static struct usb_request *at91_ep_alloc_request (struct usb_ep *_ep, unsigned int gfp_flags) | 596 | static struct usb_request * |
597 | at91_ep_alloc_request(struct usb_ep *_ep, unsigned int gfp_flags) | ||
586 | { | 598 | { |
587 | struct at91_request *req; | 599 | struct at91_request *req; |
588 | 600 | ||
589 | req = kcalloc(1, sizeof (struct at91_request), SLAB_KERNEL); | 601 | req = kcalloc(1, sizeof (struct at91_request), gfp_flags); |
590 | if (!req) | 602 | if (!req) |
591 | return NULL; | 603 | return NULL; |
592 | 604 | ||
@@ -862,6 +874,7 @@ static void stop_activity(struct at91_udc *udc) | |||
862 | if (udc->gadget.speed == USB_SPEED_UNKNOWN) | 874 | if (udc->gadget.speed == USB_SPEED_UNKNOWN) |
863 | driver = NULL; | 875 | driver = NULL; |
864 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 876 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
877 | udc->suspended = 0; | ||
865 | 878 | ||
866 | for (i = 0; i < NUM_ENDPOINTS; i++) { | 879 | for (i = 0; i < NUM_ENDPOINTS; i++) { |
867 | struct at91_ep *ep = &udc->ep[i]; | 880 | struct at91_ep *ep = &udc->ep[i]; |
@@ -889,8 +902,8 @@ static void clk_off(struct at91_udc *udc) | |||
889 | return; | 902 | return; |
890 | udc->clocked = 0; | 903 | udc->clocked = 0; |
891 | udc->gadget.speed = USB_SPEED_UNKNOWN; | 904 | udc->gadget.speed = USB_SPEED_UNKNOWN; |
892 | clk_disable(udc->iclk); | ||
893 | clk_disable(udc->fclk); | 905 | clk_disable(udc->fclk); |
906 | clk_disable(udc->iclk); | ||
894 | } | 907 | } |
895 | 908 | ||
896 | /* | 909 | /* |
@@ -911,9 +924,6 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
911 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | 924 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); |
912 | at91_set_gpio_value(udc->board.pullup_pin, 0); | 925 | at91_set_gpio_value(udc->board.pullup_pin, 0); |
913 | clk_off(udc); | 926 | clk_off(udc); |
914 | |||
915 | // REVISIT: with transceiver disabled, will D- float | ||
916 | // so that a host would falsely detect a device? | ||
917 | } | 927 | } |
918 | } | 928 | } |
919 | 929 | ||
@@ -1290,7 +1300,8 @@ static void handle_ep0(struct at91_udc *udc) | |||
1290 | if (udc->wait_for_addr_ack) { | 1300 | if (udc->wait_for_addr_ack) { |
1291 | u32 tmp; | 1301 | u32 tmp; |
1292 | 1302 | ||
1293 | at91_udp_write(AT91_UDP_FADDR, AT91_UDP_FEN | udc->addr); | 1303 | at91_udp_write(AT91_UDP_FADDR, |
1304 | AT91_UDP_FEN | udc->addr); | ||
1294 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); | 1305 | tmp = at91_udp_read(AT91_UDP_GLB_STAT); |
1295 | tmp &= ~AT91_UDP_FADDEN; | 1306 | tmp &= ~AT91_UDP_FADDEN; |
1296 | if (udc->addr) | 1307 | if (udc->addr) |
@@ -1361,9 +1372,10 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1361 | u32 rescans = 5; | 1372 | u32 rescans = 5; |
1362 | 1373 | ||
1363 | while (rescans--) { | 1374 | while (rescans--) { |
1364 | u32 status = at91_udp_read(AT91_UDP_ISR); | 1375 | u32 status; |
1365 | 1376 | ||
1366 | status &= at91_udp_read(AT91_UDP_IMR); | 1377 | status = at91_udp_read(AT91_UDP_ISR) |
1378 | & at91_udp_read(AT91_UDP_IMR); | ||
1367 | if (!status) | 1379 | if (!status) |
1368 | break; | 1380 | break; |
1369 | 1381 | ||
@@ -1379,18 +1391,17 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1379 | stop_activity(udc); | 1391 | stop_activity(udc); |
1380 | 1392 | ||
1381 | /* enable ep0 */ | 1393 | /* enable ep0 */ |
1382 | at91_udp_write(AT91_UDP_CSR(0), AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); | 1394 | at91_udp_write(AT91_UDP_CSR(0), |
1395 | AT91_UDP_EPEDS | AT91_UDP_EPTYPE_CTRL); | ||
1383 | udc->gadget.speed = USB_SPEED_FULL; | 1396 | udc->gadget.speed = USB_SPEED_FULL; |
1384 | udc->suspended = 0; | 1397 | udc->suspended = 0; |
1385 | at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); | 1398 | at91_udp_write(AT91_UDP_IER, AT91_UDP_EP(0)); |
1386 | 1399 | ||
1387 | /* | 1400 | /* |
1388 | * NOTE: this driver keeps clocks off unless the | 1401 | * NOTE: this driver keeps clocks off unless the |
1389 | * USB host is present. That saves power, and also | 1402 | * USB host is present. That saves power, but for |
1390 | * eliminates IRQs (reset, resume, suspend) that can | 1403 | * boards that don't support VBUS detection, both |
1391 | * otherwise flood from the controller. If your | 1404 | * clocks need to be active most of the time. |
1392 | * board doesn't support VBUS detection, suspend and | ||
1393 | * resume irq logic may need more attention... | ||
1394 | */ | 1405 | */ |
1395 | 1406 | ||
1396 | /* host initiated suspend (3+ms bus idle) */ | 1407 | /* host initiated suspend (3+ms bus idle) */ |
@@ -1452,13 +1463,19 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc, struct pt_regs *r) | |||
1452 | 1463 | ||
1453 | /*-------------------------------------------------------------------------*/ | 1464 | /*-------------------------------------------------------------------------*/ |
1454 | 1465 | ||
1466 | static void nop_release(struct device *dev) | ||
1467 | { | ||
1468 | /* nothing to free */ | ||
1469 | } | ||
1470 | |||
1455 | static struct at91_udc controller = { | 1471 | static struct at91_udc controller = { |
1456 | .gadget = { | 1472 | .gadget = { |
1457 | .ops = &at91_udc_ops, | 1473 | .ops = &at91_udc_ops, |
1458 | .ep0 = &controller.ep[0].ep, | 1474 | .ep0 = &controller.ep[0].ep, |
1459 | .name = driver_name, | 1475 | .name = driver_name, |
1460 | .dev = { | 1476 | .dev = { |
1461 | .bus_id = "gadget" | 1477 | .bus_id = "gadget", |
1478 | .release = nop_release, | ||
1462 | } | 1479 | } |
1463 | }, | 1480 | }, |
1464 | .ep[0] = { | 1481 | .ep[0] = { |
@@ -1468,7 +1485,8 @@ static struct at91_udc controller = { | |||
1468 | }, | 1485 | }, |
1469 | .udc = &controller, | 1486 | .udc = &controller, |
1470 | .maxpacket = 8, | 1487 | .maxpacket = 8, |
1471 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(0)), | 1488 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1489 | + AT91_UDP_CSR(0)), | ||
1472 | .int_mask = 1 << 0, | 1490 | .int_mask = 1 << 0, |
1473 | }, | 1491 | }, |
1474 | .ep[1] = { | 1492 | .ep[1] = { |
@@ -1479,7 +1497,8 @@ static struct at91_udc controller = { | |||
1479 | .udc = &controller, | 1497 | .udc = &controller, |
1480 | .is_pingpong = 1, | 1498 | .is_pingpong = 1, |
1481 | .maxpacket = 64, | 1499 | .maxpacket = 64, |
1482 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(1)), | 1500 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1501 | + AT91_UDP_CSR(1)), | ||
1483 | .int_mask = 1 << 1, | 1502 | .int_mask = 1 << 1, |
1484 | }, | 1503 | }, |
1485 | .ep[2] = { | 1504 | .ep[2] = { |
@@ -1490,7 +1509,8 @@ static struct at91_udc controller = { | |||
1490 | .udc = &controller, | 1509 | .udc = &controller, |
1491 | .is_pingpong = 1, | 1510 | .is_pingpong = 1, |
1492 | .maxpacket = 64, | 1511 | .maxpacket = 64, |
1493 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(2)), | 1512 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1513 | + AT91_UDP_CSR(2)), | ||
1494 | .int_mask = 1 << 2, | 1514 | .int_mask = 1 << 2, |
1495 | }, | 1515 | }, |
1496 | .ep[3] = { | 1516 | .ep[3] = { |
@@ -1501,7 +1521,8 @@ static struct at91_udc controller = { | |||
1501 | }, | 1521 | }, |
1502 | .udc = &controller, | 1522 | .udc = &controller, |
1503 | .maxpacket = 8, | 1523 | .maxpacket = 8, |
1504 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(3)), | 1524 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1525 | + AT91_UDP_CSR(3)), | ||
1505 | .int_mask = 1 << 3, | 1526 | .int_mask = 1 << 3, |
1506 | }, | 1527 | }, |
1507 | .ep[4] = { | 1528 | .ep[4] = { |
@@ -1512,7 +1533,8 @@ static struct at91_udc controller = { | |||
1512 | .udc = &controller, | 1533 | .udc = &controller, |
1513 | .is_pingpong = 1, | 1534 | .is_pingpong = 1, |
1514 | .maxpacket = 256, | 1535 | .maxpacket = 256, |
1515 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(4)), | 1536 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1537 | + AT91_UDP_CSR(4)), | ||
1516 | .int_mask = 1 << 4, | 1538 | .int_mask = 1 << 4, |
1517 | }, | 1539 | }, |
1518 | .ep[5] = { | 1540 | .ep[5] = { |
@@ -1523,10 +1545,11 @@ static struct at91_udc controller = { | |||
1523 | .udc = &controller, | 1545 | .udc = &controller, |
1524 | .is_pingpong = 1, | 1546 | .is_pingpong = 1, |
1525 | .maxpacket = 256, | 1547 | .maxpacket = 256, |
1526 | .creg = (void __iomem *)(AT91_VA_BASE_UDP + AT91_UDP_CSR(5)), | 1548 | .creg = (void __iomem *)(AT91_VA_BASE_UDP |
1549 | + AT91_UDP_CSR(5)), | ||
1527 | .int_mask = 1 << 5, | 1550 | .int_mask = 1 << 5, |
1528 | }, | 1551 | }, |
1529 | /* ep6 and ep7 are also reserved */ | 1552 | /* ep6 and ep7 are also reserved (custom silicon might use them) */ |
1530 | }; | 1553 | }; |
1531 | 1554 | ||
1532 | static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r) | 1555 | static irqreturn_t at91_vbus_irq(int irq, void *_udc, struct pt_regs *r) |
@@ -1593,6 +1616,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) | |||
1593 | 1616 | ||
1594 | local_irq_disable(); | 1617 | local_irq_disable(); |
1595 | udc->enabled = 0; | 1618 | udc->enabled = 0; |
1619 | at91_udp_write(AT91_UDP_IDR, ~0); | ||
1596 | pullup(udc, 0); | 1620 | pullup(udc, 0); |
1597 | local_irq_enable(); | 1621 | local_irq_enable(); |
1598 | 1622 | ||
@@ -1624,6 +1648,16 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1624 | return -ENODEV; | 1648 | return -ENODEV; |
1625 | } | 1649 | } |
1626 | 1650 | ||
1651 | if (pdev->num_resources != 2) { | ||
1652 | DBG("invalid num_resources"); | ||
1653 | return -ENODEV; | ||
1654 | } | ||
1655 | if ((pdev->resource[0].flags != IORESOURCE_MEM) | ||
1656 | || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | ||
1657 | DBG("invalid resource type"); | ||
1658 | return -ENODEV; | ||
1659 | } | ||
1660 | |||
1627 | if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) { | 1661 | if (!request_mem_region(AT91_BASE_UDP, SZ_16K, driver_name)) { |
1628 | DBG("someone's using UDC memory\n"); | 1662 | DBG("someone's using UDC memory\n"); |
1629 | return -EBUSY; | 1663 | return -EBUSY; |
@@ -1649,19 +1683,26 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1649 | if (retval < 0) | 1683 | if (retval < 0) |
1650 | goto fail0; | 1684 | goto fail0; |
1651 | 1685 | ||
1652 | /* disable everything until there's a gadget driver and vbus */ | 1686 | /* don't do anything until we have both gadget driver and VBUS */ |
1653 | pullup(udc, 0); | 1687 | clk_enable(udc->iclk); |
1688 | at91_udp_write(AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); | ||
1689 | at91_udp_write(AT91_UDP_IDR, 0xffffffff); | ||
1690 | clk_disable(udc->iclk); | ||
1654 | 1691 | ||
1655 | /* request UDC and maybe VBUS irqs */ | 1692 | /* request UDC and maybe VBUS irqs */ |
1656 | if (request_irq(AT91_ID_UDP, at91_udc_irq, IRQF_DISABLED, driver_name, udc)) { | 1693 | udc->udp_irq = platform_get_irq(pdev, 0); |
1657 | DBG("request irq %d failed\n", AT91_ID_UDP); | 1694 | if (request_irq(udc->udp_irq, at91_udc_irq, |
1695 | IRQF_DISABLED, driver_name, udc)) { | ||
1696 | DBG("request irq %d failed\n", udc->udp_irq); | ||
1658 | retval = -EBUSY; | 1697 | retval = -EBUSY; |
1659 | goto fail1; | 1698 | goto fail1; |
1660 | } | 1699 | } |
1661 | if (udc->board.vbus_pin > 0) { | 1700 | if (udc->board.vbus_pin > 0) { |
1662 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, IRQF_DISABLED, driver_name, udc)) { | 1701 | if (request_irq(udc->board.vbus_pin, at91_vbus_irq, |
1663 | DBG("request vbus irq %d failed\n", udc->board.vbus_pin); | 1702 | IRQF_DISABLED, driver_name, udc)) { |
1664 | free_irq(AT91_ID_UDP, udc); | 1703 | DBG("request vbus irq %d failed\n", |
1704 | udc->board.vbus_pin); | ||
1705 | free_irq(udc->udp_irq, udc); | ||
1665 | retval = -EBUSY; | 1706 | retval = -EBUSY; |
1666 | goto fail1; | 1707 | goto fail1; |
1667 | } | 1708 | } |
@@ -1670,6 +1711,7 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1670 | udc->vbus = 1; | 1711 | udc->vbus = 1; |
1671 | } | 1712 | } |
1672 | dev_set_drvdata(dev, udc); | 1713 | dev_set_drvdata(dev, udc); |
1714 | device_init_wakeup(dev, 1); | ||
1673 | create_debug_file(udc); | 1715 | create_debug_file(udc); |
1674 | 1716 | ||
1675 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); | 1717 | INFO("%s version %s\n", driver_name, DRIVER_VERSION); |
@@ -1678,14 +1720,14 @@ static int __devinit at91udc_probe(struct platform_device *pdev) | |||
1678 | fail1: | 1720 | fail1: |
1679 | device_unregister(&udc->gadget.dev); | 1721 | device_unregister(&udc->gadget.dev); |
1680 | fail0: | 1722 | fail0: |
1681 | release_mem_region(AT91_VA_BASE_UDP, SZ_16K); | 1723 | release_mem_region(AT91_BASE_UDP, SZ_16K); |
1682 | DBG("%s probe failed, %d\n", driver_name, retval); | 1724 | DBG("%s probe failed, %d\n", driver_name, retval); |
1683 | return retval; | 1725 | return retval; |
1684 | } | 1726 | } |
1685 | 1727 | ||
1686 | static int __devexit at91udc_remove(struct platform_device *dev) | 1728 | static int __devexit at91udc_remove(struct platform_device *pdev) |
1687 | { | 1729 | { |
1688 | struct at91_udc *udc = platform_get_drvdata(dev); | 1730 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1689 | 1731 | ||
1690 | DBG("remove\n"); | 1732 | DBG("remove\n"); |
1691 | 1733 | ||
@@ -1694,10 +1736,11 @@ static int __devexit at91udc_remove(struct platform_device *dev) | |||
1694 | if (udc->driver != 0) | 1736 | if (udc->driver != 0) |
1695 | usb_gadget_unregister_driver(udc->driver); | 1737 | usb_gadget_unregister_driver(udc->driver); |
1696 | 1738 | ||
1739 | device_init_wakeup(&pdev->dev, 0); | ||
1697 | remove_debug_file(udc); | 1740 | remove_debug_file(udc); |
1698 | if (udc->board.vbus_pin > 0) | 1741 | if (udc->board.vbus_pin > 0) |
1699 | free_irq(udc->board.vbus_pin, udc); | 1742 | free_irq(udc->board.vbus_pin, udc); |
1700 | free_irq(AT91_ID_UDP, udc); | 1743 | free_irq(udc->udp_irq, udc); |
1701 | device_unregister(&udc->gadget.dev); | 1744 | device_unregister(&udc->gadget.dev); |
1702 | release_mem_region(AT91_BASE_UDP, SZ_16K); | 1745 | release_mem_region(AT91_BASE_UDP, SZ_16K); |
1703 | 1746 | ||
@@ -1708,31 +1751,36 @@ static int __devexit at91udc_remove(struct platform_device *dev) | |||
1708 | } | 1751 | } |
1709 | 1752 | ||
1710 | #ifdef CONFIG_PM | 1753 | #ifdef CONFIG_PM |
1711 | static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg) | 1754 | static int at91udc_suspend(struct platform_device *pdev, pm_message_t mesg) |
1712 | { | 1755 | { |
1713 | struct at91_udc *udc = platform_get_drvdata(dev); | 1756 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1757 | int wake = udc->driver && device_may_wakeup(&pdev->dev); | ||
1714 | 1758 | ||
1715 | /* | 1759 | /* Unless we can act normally to the host (letting it wake us up |
1716 | * The "safe" suspend transitions are opportunistic ... e.g. when | 1760 | * whenever it has work for us) force disconnect. Wakeup requires |
1717 | * the USB link is suspended (48MHz clock autogated off), or when | 1761 | * PLLB for USB events (signaling for reset, wakeup, or incoming |
1718 | * it's disconnected (programmatically gated off, elsewhere). | 1762 | * tokens) and VBUS irqs (on systems which support them). |
1719 | * Then we can suspend, and the chip can enter slow clock mode. | ||
1720 | * | ||
1721 | * The problem case is some component (user mode?) suspending this | ||
1722 | * device while it's active, with the 48 MHz clock in use. There | ||
1723 | * are two basic approaches: (a) veto suspend levels involving slow | ||
1724 | * clock mode, (b) disconnect, so 48 MHz will no longer be in use | ||
1725 | * and we can enter slow clock mode. This uses (b) for now, since | ||
1726 | * it's simplest until AT91 PM exists and supports the other option. | ||
1727 | */ | 1763 | */ |
1728 | if (udc->vbus && !udc->suspended) | 1764 | if ((!udc->suspended && udc->addr) |
1765 | || !wake | ||
1766 | || at91_suspend_entering_slow_clock()) { | ||
1729 | pullup(udc, 0); | 1767 | pullup(udc, 0); |
1768 | disable_irq_wake(udc->udp_irq); | ||
1769 | } else | ||
1770 | enable_irq_wake(udc->udp_irq); | ||
1771 | |||
1772 | if (udc->board.vbus_pin > 0) { | ||
1773 | if (wake) | ||
1774 | enable_irq_wake(udc->board.vbus_pin); | ||
1775 | else | ||
1776 | disable_irq_wake(udc->board.vbus_pin); | ||
1777 | } | ||
1730 | return 0; | 1778 | return 0; |
1731 | } | 1779 | } |
1732 | 1780 | ||
1733 | static int at91udc_resume(struct platform_device *dev) | 1781 | static int at91udc_resume(struct platform_device *pdev) |
1734 | { | 1782 | { |
1735 | struct at91_udc *udc = platform_get_drvdata(dev); | 1783 | struct at91_udc *udc = platform_get_drvdata(pdev); |
1736 | 1784 | ||
1737 | /* maybe reconnect to host; if so, clocks on */ | 1785 | /* maybe reconnect to host; if so, clocks on */ |
1738 | pullup(udc, 1); | 1786 | pullup(udc, 1); |
@@ -1748,7 +1796,7 @@ static struct platform_driver at91_udc = { | |||
1748 | .remove = __devexit_p(at91udc_remove), | 1796 | .remove = __devexit_p(at91udc_remove), |
1749 | .shutdown = at91udc_shutdown, | 1797 | .shutdown = at91udc_shutdown, |
1750 | .suspend = at91udc_suspend, | 1798 | .suspend = at91udc_suspend, |
1751 | .resume = at91udc_resume, | 1799 | .resume = at91udc_resume, |
1752 | .driver = { | 1800 | .driver = { |
1753 | .name = (char *) driver_name, | 1801 | .name = (char *) driver_name, |
1754 | .owner = THIS_MODULE, | 1802 | .owner = THIS_MODULE, |
@@ -1767,6 +1815,6 @@ static void __devexit udc_exit_module(void) | |||
1767 | } | 1815 | } |
1768 | module_exit(udc_exit_module); | 1816 | module_exit(udc_exit_module); |
1769 | 1817 | ||
1770 | MODULE_DESCRIPTION("AT91RM9200 udc driver"); | 1818 | MODULE_DESCRIPTION("AT91 udc driver"); |
1771 | MODULE_AUTHOR("Thomas Rathbone, David Brownell"); | 1819 | MODULE_AUTHOR("Thomas Rathbone, David Brownell"); |
1772 | MODULE_LICENSE("GPL"); | 1820 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/gadget/at91_udc.h b/drivers/usb/gadget/at91_udc.h index 5a4799cedd19..882af42e86cc 100644 --- a/drivers/usb/gadget/at91_udc.h +++ b/drivers/usb/gadget/at91_udc.h | |||
@@ -141,6 +141,7 @@ struct at91_udc { | |||
141 | struct clk *iclk, *fclk; | 141 | struct clk *iclk, *fclk; |
142 | struct platform_device *pdev; | 142 | struct platform_device *pdev; |
143 | struct proc_dir_entry *pde; | 143 | struct proc_dir_entry *pde; |
144 | int udp_irq; | ||
144 | }; | 145 | }; |
145 | 146 | ||
146 | static inline struct at91_udc *to_udc(struct usb_gadget *g) | 147 | static inline struct at91_udc *to_udc(struct usb_gadget *g) |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 4be47195bd38..7d1c22c34957 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
@@ -609,7 +609,8 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
609 | if (!dum->driver) | 609 | if (!dum->driver) |
610 | return -ESHUTDOWN; | 610 | return -ESHUTDOWN; |
611 | 611 | ||
612 | spin_lock_irqsave (&dum->lock, flags); | 612 | local_irq_save (flags); |
613 | spin_lock (&dum->lock); | ||
613 | list_for_each_entry (req, &ep->queue, queue) { | 614 | list_for_each_entry (req, &ep->queue, queue) { |
614 | if (&req->req == _req) { | 615 | if (&req->req == _req) { |
615 | list_del_init (&req->queue); | 616 | list_del_init (&req->queue); |
@@ -618,7 +619,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
618 | break; | 619 | break; |
619 | } | 620 | } |
620 | } | 621 | } |
621 | spin_unlock_irqrestore (&dum->lock, flags); | 622 | spin_unlock (&dum->lock); |
622 | 623 | ||
623 | if (retval == 0) { | 624 | if (retval == 0) { |
624 | dev_dbg (udc_dev(dum), | 625 | dev_dbg (udc_dev(dum), |
@@ -626,6 +627,7 @@ static int dummy_dequeue (struct usb_ep *_ep, struct usb_request *_req) | |||
626 | req, _ep->name, _req->length, _req->buf); | 627 | req, _ep->name, _req->length, _req->buf); |
627 | _req->complete (_ep, _req); | 628 | _req->complete (_ep, _req); |
628 | } | 629 | } |
630 | local_irq_restore (flags); | ||
629 | return retval; | 631 | return retval; |
630 | } | 632 | } |
631 | 633 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 85b0b4ad4c16..d63177a8eaea 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -892,7 +892,7 @@ MODULE_LICENSE ("GPL"); | |||
892 | #define PCI_DRIVER ehci_pci_driver | 892 | #define PCI_DRIVER ehci_pci_driver |
893 | #endif | 893 | #endif |
894 | 894 | ||
895 | #ifdef CONFIG_PPC_83xx | 895 | #ifdef CONFIG_MPC834x |
896 | #include "ehci-fsl.c" | 896 | #include "ehci-fsl.c" |
897 | #define PLATFORM_DRIVER ehci_fsl_driver | 897 | #define PLATFORM_DRIVER ehci_fsl_driver |
898 | #endif | 898 | #endif |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index cdbafb710000..85cc059705a6 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Copyright (C) 2004 SAN People (Pty) Ltd. | 4 | * Copyright (C) 2004 SAN People (Pty) Ltd. |
5 | * Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> | 5 | * Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> |
6 | * | 6 | * |
7 | * AT91RM9200 Bus Glue | 7 | * AT91 Bus Glue |
8 | * | 8 | * |
9 | * Based on fragments of 2.4 driver by Rick Bronson. | 9 | * Based on fragments of 2.4 driver by Rick Bronson. |
10 | * Based on ohci-omap.c | 10 | * Based on ohci-omap.c |
@@ -19,12 +19,13 @@ | |||
19 | #include <asm/hardware.h> | 19 | #include <asm/hardware.h> |
20 | #include <asm/arch/board.h> | 20 | #include <asm/arch/board.h> |
21 | 21 | ||
22 | #ifndef CONFIG_ARCH_AT91RM9200 | 22 | #ifndef CONFIG_ARCH_AT91 |
23 | #error "CONFIG_ARCH_AT91RM9200 must be defined." | 23 | #error "CONFIG_ARCH_AT91 must be defined." |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | /* interface and function clocks */ | 26 | /* interface and function clocks */ |
27 | static struct clk *iclk, *fclk; | 27 | static struct clk *iclk, *fclk; |
28 | static int clocked; | ||
28 | 29 | ||
29 | extern int usb_disabled(void); | 30 | extern int usb_disabled(void); |
30 | 31 | ||
@@ -35,13 +36,14 @@ static void at91_start_hc(struct platform_device *pdev) | |||
35 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 36 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
36 | struct ohci_regs __iomem *regs = hcd->regs; | 37 | struct ohci_regs __iomem *regs = hcd->regs; |
37 | 38 | ||
38 | dev_dbg(&pdev->dev, "starting AT91RM9200 OHCI USB Controller\n"); | 39 | dev_dbg(&pdev->dev, "start\n"); |
39 | 40 | ||
40 | /* | 41 | /* |
41 | * Start the USB clocks. | 42 | * Start the USB clocks. |
42 | */ | 43 | */ |
43 | clk_enable(iclk); | 44 | clk_enable(iclk); |
44 | clk_enable(fclk); | 45 | clk_enable(fclk); |
46 | clocked = 1; | ||
45 | 47 | ||
46 | /* | 48 | /* |
47 | * The USB host controller must remain in reset. | 49 | * The USB host controller must remain in reset. |
@@ -54,7 +56,7 @@ static void at91_stop_hc(struct platform_device *pdev) | |||
54 | struct usb_hcd *hcd = platform_get_drvdata(pdev); | 56 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
55 | struct ohci_regs __iomem *regs = hcd->regs; | 57 | struct ohci_regs __iomem *regs = hcd->regs; |
56 | 58 | ||
57 | dev_dbg(&pdev->dev, "stopping AT91RM9200 OHCI USB Controller\n"); | 59 | dev_dbg(&pdev->dev, "stop\n"); |
58 | 60 | ||
59 | /* | 61 | /* |
60 | * Put the USB host controller into reset. | 62 | * Put the USB host controller into reset. |
@@ -66,6 +68,7 @@ static void at91_stop_hc(struct platform_device *pdev) | |||
66 | */ | 68 | */ |
67 | clk_disable(fclk); | 69 | clk_disable(fclk); |
68 | clk_disable(iclk); | 70 | clk_disable(iclk); |
71 | clocked = 0; | ||
69 | } | 72 | } |
70 | 73 | ||
71 | 74 | ||
@@ -78,14 +81,15 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); | |||
78 | 81 | ||
79 | 82 | ||
80 | /** | 83 | /** |
81 | * usb_hcd_at91_probe - initialize AT91RM9200-based HCDs | 84 | * usb_hcd_at91_probe - initialize AT91-based HCDs |
82 | * Context: !in_interrupt() | 85 | * Context: !in_interrupt() |
83 | * | 86 | * |
84 | * Allocates basic resources for this USB host controller, and | 87 | * Allocates basic resources for this USB host controller, and |
85 | * then invokes the start() method for the HCD associated with it | 88 | * then invokes the start() method for the HCD associated with it |
86 | * through the hotplug entry's driver_data. | 89 | * through the hotplug entry's driver_data. |
87 | */ | 90 | */ |
88 | int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev) | 91 | static int usb_hcd_at91_probe(const struct hc_driver *driver, |
92 | struct platform_device *pdev) | ||
89 | { | 93 | { |
90 | int retval; | 94 | int retval; |
91 | struct usb_hcd *hcd = NULL; | 95 | struct usb_hcd *hcd = NULL; |
@@ -95,12 +99,13 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * | |||
95 | return -ENODEV; | 99 | return -ENODEV; |
96 | } | 100 | } |
97 | 101 | ||
98 | if ((pdev->resource[0].flags != IORESOURCE_MEM) || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | 102 | if ((pdev->resource[0].flags != IORESOURCE_MEM) |
103 | || (pdev->resource[1].flags != IORESOURCE_IRQ)) { | ||
99 | pr_debug("hcd probe: invalid resource type\n"); | 104 | pr_debug("hcd probe: invalid resource type\n"); |
100 | return -ENODEV; | 105 | return -ENODEV; |
101 | } | 106 | } |
102 | 107 | ||
103 | hcd = usb_create_hcd(driver, &pdev->dev, "at91rm9200"); | 108 | hcd = usb_create_hcd(driver, &pdev->dev, "at91"); |
104 | if (!hcd) | 109 | if (!hcd) |
105 | return -ENOMEM; | 110 | return -ENOMEM; |
106 | hcd->rsrc_start = pdev->resource[0].start; | 111 | hcd->rsrc_start = pdev->resource[0].start; |
@@ -149,21 +154,23 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * | |||
149 | /* may be called with controller, bus, and devices active */ | 154 | /* may be called with controller, bus, and devices active */ |
150 | 155 | ||
151 | /** | 156 | /** |
152 | * usb_hcd_at91_remove - shutdown processing for AT91RM9200-based HCDs | 157 | * usb_hcd_at91_remove - shutdown processing for AT91-based HCDs |
153 | * @dev: USB Host Controller being removed | 158 | * @dev: USB Host Controller being removed |
154 | * Context: !in_interrupt() | 159 | * Context: !in_interrupt() |
155 | * | 160 | * |
156 | * Reverses the effect of usb_hcd_at91_probe(), first invoking | 161 | * Reverses the effect of usb_hcd_at91_probe(), first invoking |
157 | * the HCD's stop() method. It is always called from a thread | 162 | * the HCD's stop() method. It is always called from a thread |
158 | * context, normally "rmmod", "apmd", or something similar. | 163 | * context, "rmmod" or something similar. |
159 | * | 164 | * |
160 | */ | 165 | */ |
161 | static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pdev) | 166 | static int usb_hcd_at91_remove(struct usb_hcd *hcd, |
167 | struct platform_device *pdev) | ||
162 | { | 168 | { |
163 | usb_remove_hcd(hcd); | 169 | usb_remove_hcd(hcd); |
164 | at91_stop_hc(pdev); | 170 | at91_stop_hc(pdev); |
165 | iounmap(hcd->regs); | 171 | iounmap(hcd->regs); |
166 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 172 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
173 | disable_irq_wake(hcd->irq); | ||
167 | 174 | ||
168 | clk_put(fclk); | 175 | clk_put(fclk); |
169 | clk_put(iclk); | 176 | clk_put(iclk); |
@@ -178,19 +185,21 @@ static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pde | |||
178 | static int __devinit | 185 | static int __devinit |
179 | ohci_at91_start (struct usb_hcd *hcd) | 186 | ohci_at91_start (struct usb_hcd *hcd) |
180 | { | 187 | { |
181 | // struct at91_ohci_data *board = hcd->self.controller->platform_data; | 188 | struct at91_usbh_data *board = hcd->self.controller->platform_data; |
182 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 189 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
190 | struct usb_device *root = hcd->self.root_hub; | ||
183 | int ret; | 191 | int ret; |
184 | 192 | ||
185 | if ((ret = ohci_init(ohci)) < 0) | 193 | if ((ret = ohci_init(ohci)) < 0) |
186 | return ret; | 194 | return ret; |
187 | 195 | ||
196 | root->maxchild = board->ports; | ||
197 | |||
188 | if ((ret = ohci_run(ohci)) < 0) { | 198 | if ((ret = ohci_run(ohci)) < 0) { |
189 | err("can't start %s", hcd->self.bus_name); | 199 | err("can't start %s", hcd->self.bus_name); |
190 | ohci_stop(hcd); | 200 | ohci_stop(hcd); |
191 | return ret; | 201 | return ret; |
192 | } | 202 | } |
193 | // hcd->self.root_hub->maxchild = board->ports; | ||
194 | return 0; | 203 | return 0; |
195 | } | 204 | } |
196 | 205 | ||
@@ -198,7 +207,7 @@ ohci_at91_start (struct usb_hcd *hcd) | |||
198 | 207 | ||
199 | static const struct hc_driver ohci_at91_hc_driver = { | 208 | static const struct hc_driver ohci_at91_hc_driver = { |
200 | .description = hcd_name, | 209 | .description = hcd_name, |
201 | .product_desc = "AT91RM9200 OHCI", | 210 | .product_desc = "AT91 OHCI", |
202 | .hcd_priv_size = sizeof(struct ohci_hcd), | 211 | .hcd_priv_size = sizeof(struct ohci_hcd), |
203 | 212 | ||
204 | /* | 213 | /* |
@@ -240,33 +249,54 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
240 | 249 | ||
241 | /*-------------------------------------------------------------------------*/ | 250 | /*-------------------------------------------------------------------------*/ |
242 | 251 | ||
243 | static int ohci_hcd_at91_drv_probe(struct platform_device *dev) | 252 | static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) |
244 | { | 253 | { |
245 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, dev); | 254 | device_init_wakeup(&pdev->dev, 1); |
255 | return usb_hcd_at91_probe(&ohci_at91_hc_driver, pdev); | ||
246 | } | 256 | } |
247 | 257 | ||
248 | static int ohci_hcd_at91_drv_remove(struct platform_device *dev) | 258 | static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) |
249 | { | 259 | { |
250 | return usb_hcd_at91_remove(platform_get_drvdata(dev), dev); | 260 | device_init_wakeup(&pdev->dev, 0); |
261 | return usb_hcd_at91_remove(platform_get_drvdata(pdev), pdev); | ||
251 | } | 262 | } |
252 | 263 | ||
253 | #ifdef CONFIG_PM | 264 | #ifdef CONFIG_PM |
254 | 265 | ||
255 | /* REVISIT suspend/resume look "too" simple here */ | ||
256 | |||
257 | static int | 266 | static int |
258 | ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg) | 267 | ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) |
259 | { | 268 | { |
260 | clk_disable(fclk); | 269 | struct usb_hcd *hcd = platform_get_drvdata(pdev); |
261 | clk_disable(iclk); | 270 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
271 | |||
272 | if (device_may_wakeup(&pdev->dev)) | ||
273 | enable_irq_wake(hcd->irq); | ||
274 | else | ||
275 | disable_irq_wake(hcd->irq); | ||
276 | |||
277 | /* | ||
278 | * The integrated transceivers seem unable to notice disconnect, | ||
279 | * reconnect, or wakeup without the 48 MHz clock active. so for | ||
280 | * correctness, always discard connection state (using reset). | ||
281 | * | ||
282 | * REVISIT: some boards will be able to turn VBUS off... | ||
283 | */ | ||
284 | if (at91_suspend_entering_slow_clock()) { | ||
285 | ohci_usb_reset (ohci); | ||
286 | clk_disable(fclk); | ||
287 | clk_disable(iclk); | ||
288 | clocked = 0; | ||
289 | } | ||
262 | 290 | ||
263 | return 0; | 291 | return 0; |
264 | } | 292 | } |
265 | 293 | ||
266 | static int ohci_hcd_at91_drv_resume(struct platform_device *dev) | 294 | static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) |
267 | { | 295 | { |
268 | clk_enable(iclk); | 296 | if (!clocked) { |
269 | clk_enable(fclk); | 297 | clk_enable(iclk); |
298 | clk_enable(fclk); | ||
299 | } | ||
270 | 300 | ||
271 | return 0; | 301 | return 0; |
272 | } | 302 | } |
@@ -275,7 +305,7 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *dev) | |||
275 | #define ohci_hcd_at91_drv_resume NULL | 305 | #define ohci_hcd_at91_drv_resume NULL |
276 | #endif | 306 | #endif |
277 | 307 | ||
278 | MODULE_ALIAS("at91rm9200-ohci"); | 308 | MODULE_ALIAS("at91_ohci"); |
279 | 309 | ||
280 | static struct platform_driver ohci_hcd_at91_driver = { | 310 | static struct platform_driver ohci_hcd_at91_driver = { |
281 | .probe = ohci_hcd_at91_drv_probe, | 311 | .probe = ohci_hcd_at91_drv_probe, |
@@ -283,7 +313,7 @@ static struct platform_driver ohci_hcd_at91_driver = { | |||
283 | .suspend = ohci_hcd_at91_drv_suspend, | 313 | .suspend = ohci_hcd_at91_drv_suspend, |
284 | .resume = ohci_hcd_at91_drv_resume, | 314 | .resume = ohci_hcd_at91_drv_resume, |
285 | .driver = { | 315 | .driver = { |
286 | .name = "at91rm9200-ohci", | 316 | .name = "at91_ohci", |
287 | .owner = THIS_MODULE, | 317 | .owner = THIS_MODULE, |
288 | }, | 318 | }, |
289 | }; | 319 | }; |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index afef5ac35b4a..94d8cf4b36c1 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -913,7 +913,7 @@ MODULE_LICENSE ("GPL"); | |||
913 | #include "ohci-ppc-soc.c" | 913 | #include "ohci-ppc-soc.c" |
914 | #endif | 914 | #endif |
915 | 915 | ||
916 | #ifdef CONFIG_ARCH_AT91RM9200 | 916 | #if defined(CONFIG_ARCH_AT91RM9200) || defined(CONFIG_ARCH_AT91SAM9261) |
917 | #include "ohci-at91.c" | 917 | #include "ohci-at91.c" |
918 | #endif | 918 | #endif |
919 | 919 | ||
@@ -927,6 +927,7 @@ MODULE_LICENSE ("GPL"); | |||
927 | || defined (CONFIG_SOC_AU1X00) \ | 927 | || defined (CONFIG_SOC_AU1X00) \ |
928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ | 928 | || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \ |
929 | || defined (CONFIG_ARCH_AT91RM9200) \ | 929 | || defined (CONFIG_ARCH_AT91RM9200) \ |
930 | || defined (CONFIG_ARCH_AT91SAM9261) \ | ||
930 | ) | 931 | ) |
931 | #error "missing bus glue for ohci-hcd" | 932 | #error "missing bus glue for ohci-hcd" |
932 | #endif | 933 | #endif |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index c9d72ac0a1d7..66c3f61bc9d1 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -943,7 +943,9 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
943 | /* We received a short packet */ | 943 | /* We received a short packet */ |
944 | if (urb->transfer_flags & URB_SHORT_NOT_OK) | 944 | if (urb->transfer_flags & URB_SHORT_NOT_OK) |
945 | ret = -EREMOTEIO; | 945 | ret = -EREMOTEIO; |
946 | else if (ctrlstat & TD_CTRL_SPD) | 946 | |
947 | /* Fixup needed only if this isn't the URB's last TD */ | ||
948 | else if (&td->list != urbp->td_list.prev) | ||
947 | ret = 1; | 949 | ret = 1; |
948 | } | 950 | } |
949 | 951 | ||
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index 05d2d6012eb2..df198cf76f52 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -152,9 +152,8 @@ static const char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | |||
152 | * events. The hardware generates 5 events for the first keypress | 152 | * events. The hardware generates 5 events for the first keypress |
153 | * and we have to take this into account for an accurate repeat | 153 | * and we have to take this into account for an accurate repeat |
154 | * behaviour. | 154 | * behaviour. |
155 | * (HZ / 20) == 50 ms and works well for me. | ||
156 | */ | 155 | */ |
157 | #define FILTER_TIME (HZ / 20) | 156 | #define FILTER_TIME 60 /* msec */ |
158 | 157 | ||
159 | struct ati_remote { | 158 | struct ati_remote { |
160 | struct input_dev *idev; | 159 | struct input_dev *idev; |
@@ -467,7 +466,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | |||
467 | /* Filter duplicate events which happen "too close" together. */ | 466 | /* Filter duplicate events which happen "too close" together. */ |
468 | if ((ati_remote->old_data[0] == data[1]) && | 467 | if ((ati_remote->old_data[0] == data[1]) && |
469 | (ati_remote->old_data[1] == data[2]) && | 468 | (ati_remote->old_data[1] == data[2]) && |
470 | time_before(jiffies, ati_remote->old_jiffies + FILTER_TIME)) { | 469 | time_before(jiffies, ati_remote->old_jiffies + msecs_to_jiffies(FILTER_TIME))) { |
471 | ati_remote->repeat_count++; | 470 | ati_remote->repeat_count++; |
472 | } else { | 471 | } else { |
473 | ati_remote->repeat_count = 0; | 472 | ati_remote->repeat_count = 0; |
diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c index e091d327bd9e..a4062a6adbb8 100644 --- a/drivers/usb/misc/cypress_cy7c63.c +++ b/drivers/usb/misc/cypress_cy7c63.c | |||
@@ -12,8 +12,13 @@ | |||
12 | * the single I/O ports of the device. | 12 | * the single I/O ports of the device. |
13 | * | 13 | * |
14 | * Supported vendors: AK Modul-Bus Computer GmbH | 14 | * Supported vendors: AK Modul-Bus Computer GmbH |
15 | * Supported devices: CY7C63001A-PC (to be continued...) | 15 | * (Firmware "Port-Chip") |
16 | * Supported functions: Read/Write Ports (to be continued...) | 16 | * |
17 | * Supported devices: CY7C63001A-PC | ||
18 | * CY7C63001C-PXC | ||
19 | * CY7C63001C-SXC | ||
20 | * | ||
21 | * Supported functions: Read/Write Ports | ||
17 | * | 22 | * |
18 | * | 23 | * |
19 | * This program is free software; you can redistribute it and/or | 24 | * This program is free software; you can redistribute it and/or |
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index e5e6e4f3ef87..bd09232ce13c 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c | |||
@@ -175,6 +175,8 @@ static inline struct sk_buff *pull_skb(rtl8150_t *); | |||
175 | static void rtl8150_disconnect(struct usb_interface *intf); | 175 | static void rtl8150_disconnect(struct usb_interface *intf); |
176 | static int rtl8150_probe(struct usb_interface *intf, | 176 | static int rtl8150_probe(struct usb_interface *intf, |
177 | const struct usb_device_id *id); | 177 | const struct usb_device_id *id); |
178 | static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message); | ||
179 | static int rtl8150_resume(struct usb_interface *intf); | ||
178 | 180 | ||
179 | static const char driver_name [] = "rtl8150"; | 181 | static const char driver_name [] = "rtl8150"; |
180 | 182 | ||
@@ -183,6 +185,8 @@ static struct usb_driver rtl8150_driver = { | |||
183 | .probe = rtl8150_probe, | 185 | .probe = rtl8150_probe, |
184 | .disconnect = rtl8150_disconnect, | 186 | .disconnect = rtl8150_disconnect, |
185 | .id_table = rtl8150_table, | 187 | .id_table = rtl8150_table, |
188 | .suspend = rtl8150_suspend, | ||
189 | .resume = rtl8150_resume | ||
186 | }; | 190 | }; |
187 | 191 | ||
188 | /* | 192 | /* |
@@ -238,9 +242,11 @@ static int async_set_registers(rtl8150_t * dev, u16 indx, u16 size) | |||
238 | usb_fill_control_urb(dev->ctrl_urb, dev->udev, | 242 | usb_fill_control_urb(dev->ctrl_urb, dev->udev, |
239 | usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, | 243 | usb_sndctrlpipe(dev->udev, 0), (char *) &dev->dr, |
240 | &dev->rx_creg, size, ctrl_callback, dev); | 244 | &dev->rx_creg, size, ctrl_callback, dev); |
241 | if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) | 245 | if ((ret = usb_submit_urb(dev->ctrl_urb, GFP_ATOMIC))) { |
246 | if (ret == -ENODEV) | ||
247 | netif_device_detach(dev->netdev); | ||
242 | err("control request submission failed: %d", ret); | 248 | err("control request submission failed: %d", ret); |
243 | else | 249 | } else |
244 | set_bit(RX_REG_SET, &dev->flags); | 250 | set_bit(RX_REG_SET, &dev->flags); |
245 | 251 | ||
246 | return ret; | 252 | return ret; |
@@ -416,6 +422,7 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
416 | struct sk_buff *skb; | 422 | struct sk_buff *skb; |
417 | struct net_device *netdev; | 423 | struct net_device *netdev; |
418 | u16 rx_stat; | 424 | u16 rx_stat; |
425 | int status; | ||
419 | 426 | ||
420 | dev = urb->context; | 427 | dev = urb->context; |
421 | if (!dev) | 428 | if (!dev) |
@@ -465,7 +472,10 @@ static void read_bulk_callback(struct urb *urb, struct pt_regs *regs) | |||
465 | goon: | 472 | goon: |
466 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 473 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
467 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 474 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
468 | if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { | 475 | status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); |
476 | if (status == -ENODEV) | ||
477 | netif_device_detach(dev->netdev); | ||
478 | else if (status) { | ||
469 | set_bit(RX_URB_FAIL, &dev->flags); | 479 | set_bit(RX_URB_FAIL, &dev->flags); |
470 | goto resched; | 480 | goto resched; |
471 | } else { | 481 | } else { |
@@ -481,6 +491,7 @@ static void rx_fixup(unsigned long data) | |||
481 | { | 491 | { |
482 | rtl8150_t *dev; | 492 | rtl8150_t *dev; |
483 | struct sk_buff *skb; | 493 | struct sk_buff *skb; |
494 | int status; | ||
484 | 495 | ||
485 | dev = (rtl8150_t *)data; | 496 | dev = (rtl8150_t *)data; |
486 | 497 | ||
@@ -499,10 +510,13 @@ static void rx_fixup(unsigned long data) | |||
499 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 510 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
500 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 511 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
501 | try_again: | 512 | try_again: |
502 | if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { | 513 | status = usb_submit_urb(dev->rx_urb, GFP_ATOMIC); |
514 | if (status == -ENODEV) { | ||
515 | netif_device_detach(dev->netdev); | ||
516 | } else if (status) { | ||
503 | set_bit(RX_URB_FAIL, &dev->flags); | 517 | set_bit(RX_URB_FAIL, &dev->flags); |
504 | goto tlsched; | 518 | goto tlsched; |
505 | } else { | 519 | } else { |
506 | clear_bit(RX_URB_FAIL, &dev->flags); | 520 | clear_bit(RX_URB_FAIL, &dev->flags); |
507 | } | 521 | } |
508 | 522 | ||
@@ -574,12 +588,43 @@ static void intr_callback(struct urb *urb, struct pt_regs *regs) | |||
574 | 588 | ||
575 | resubmit: | 589 | resubmit: |
576 | status = usb_submit_urb (urb, SLAB_ATOMIC); | 590 | status = usb_submit_urb (urb, SLAB_ATOMIC); |
577 | if (status) | 591 | if (status == -ENODEV) |
592 | netif_device_detach(dev->netdev); | ||
593 | else if (status) | ||
578 | err ("can't resubmit intr, %s-%s/input0, status %d", | 594 | err ("can't resubmit intr, %s-%s/input0, status %d", |
579 | dev->udev->bus->bus_name, | 595 | dev->udev->bus->bus_name, |
580 | dev->udev->devpath, status); | 596 | dev->udev->devpath, status); |
581 | } | 597 | } |
582 | 598 | ||
599 | static int rtl8150_suspend(struct usb_interface *intf, pm_message_t message) | ||
600 | { | ||
601 | rtl8150_t *dev = usb_get_intfdata(intf); | ||
602 | |||
603 | netif_device_detach(dev->netdev); | ||
604 | |||
605 | if (netif_running(dev->netdev)) { | ||
606 | usb_kill_urb(dev->rx_urb); | ||
607 | usb_kill_urb(dev->intr_urb); | ||
608 | } | ||
609 | return 0; | ||
610 | } | ||
611 | |||
612 | static int rtl8150_resume(struct usb_interface *intf) | ||
613 | { | ||
614 | rtl8150_t *dev = usb_get_intfdata(intf); | ||
615 | |||
616 | netif_device_attach(dev->netdev); | ||
617 | if (netif_running(dev->netdev)) { | ||
618 | dev->rx_urb->status = 0; | ||
619 | dev->rx_urb->actual_length = 0; | ||
620 | read_bulk_callback(dev->rx_urb, NULL); | ||
621 | |||
622 | dev->intr_urb->status = 0; | ||
623 | dev->intr_urb->actual_length = 0; | ||
624 | intr_callback(dev->intr_urb, NULL); | ||
625 | } | ||
626 | return 0; | ||
627 | } | ||
583 | 628 | ||
584 | /* | 629 | /* |
585 | ** | 630 | ** |
@@ -690,9 +735,14 @@ static int rtl8150_start_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
690 | usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), | 735 | usb_fill_bulk_urb(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), |
691 | skb->data, count, write_bulk_callback, dev); | 736 | skb->data, count, write_bulk_callback, dev); |
692 | if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { | 737 | if ((res = usb_submit_urb(dev->tx_urb, GFP_ATOMIC))) { |
693 | warn("failed tx_urb %d\n", res); | 738 | /* Can we get/handle EPIPE here? */ |
694 | dev->stats.tx_errors++; | 739 | if (res == -ENODEV) |
695 | netif_start_queue(netdev); | 740 | netif_device_detach(dev->netdev); |
741 | else { | ||
742 | warn("failed tx_urb %d\n", res); | ||
743 | dev->stats.tx_errors++; | ||
744 | netif_start_queue(netdev); | ||
745 | } | ||
696 | } else { | 746 | } else { |
697 | dev->stats.tx_packets++; | 747 | dev->stats.tx_packets++; |
698 | dev->stats.tx_bytes += skb->len; | 748 | dev->stats.tx_bytes += skb->len; |
@@ -729,16 +779,25 @@ static int rtl8150_open(struct net_device *netdev) | |||
729 | 779 | ||
730 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), | 780 | usb_fill_bulk_urb(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), |
731 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); | 781 | dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); |
732 | if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) | 782 | if ((res = usb_submit_urb(dev->rx_urb, GFP_KERNEL))) { |
783 | if (res == -ENODEV) | ||
784 | netif_device_detach(dev->netdev); | ||
733 | warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); | 785 | warn("%s: rx_urb submit failed: %d", __FUNCTION__, res); |
786 | return res; | ||
787 | } | ||
734 | usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), | 788 | usb_fill_int_urb(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev, 3), |
735 | dev->intr_buff, INTBUFSIZE, intr_callback, | 789 | dev->intr_buff, INTBUFSIZE, intr_callback, |
736 | dev, dev->intr_interval); | 790 | dev, dev->intr_interval); |
737 | if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) | 791 | if ((res = usb_submit_urb(dev->intr_urb, GFP_KERNEL))) { |
792 | if (res == -ENODEV) | ||
793 | netif_device_detach(dev->netdev); | ||
738 | warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); | 794 | warn("%s: intr_urb submit failed: %d", __FUNCTION__, res); |
739 | netif_start_queue(netdev); | 795 | usb_kill_urb(dev->rx_urb); |
796 | return res; | ||
797 | } | ||
740 | enable_net_traffic(dev); | 798 | enable_net_traffic(dev); |
741 | set_carrier(netdev); | 799 | set_carrier(netdev); |
800 | netif_start_queue(netdev); | ||
742 | 801 | ||
743 | return res; | 802 | return res; |
744 | } | 803 | } |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index ac33bd47cfce..f5b9438c94f0 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -62,15 +62,6 @@ config USB_SERIAL_AIRPRIME | |||
62 | To compile this driver as a module, choose M here: the | 62 | To compile this driver as a module, choose M here: the |
63 | module will be called airprime. | 63 | module will be called airprime. |
64 | 64 | ||
65 | config USB_SERIAL_ANYDATA | ||
66 | tristate "USB AnyData CDMA Wireless Driver" | ||
67 | depends on USB_SERIAL | ||
68 | help | ||
69 | Say Y here if you want to use a AnyData CDMA device. | ||
70 | |||
71 | To compile this driver as a module, choose M here: the | ||
72 | module will be called anydata. | ||
73 | |||
74 | config USB_SERIAL_ARK3116 | 65 | config USB_SERIAL_ARK3116 |
75 | tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" | 66 | tristate "USB ARK Micro 3116 USB Serial Driver (EXPERIMENTAL)" |
76 | depends on USB_SERIAL && EXPERIMENTAL | 67 | depends on USB_SERIAL && EXPERIMENTAL |
@@ -502,15 +493,18 @@ config USB_SERIAL_XIRCOM | |||
502 | module will be called keyspan_pda. | 493 | module will be called keyspan_pda. |
503 | 494 | ||
504 | config USB_SERIAL_OPTION | 495 | config USB_SERIAL_OPTION |
505 | tristate "USB driver for GSM modems" | 496 | tristate "USB driver for GSM and CDMA modems" |
506 | depends on USB_SERIAL | 497 | depends on USB_SERIAL |
507 | help | 498 | help |
508 | Say Y here if you have an "Option" GSM PCMCIA card | 499 | Say Y here if you have a GSM or CDMA modem that's connected to USB. |
509 | (or an OEM version: branded Huawei, Audiovox, or Novatel). | 500 | |
501 | This driver also supports several PCMCIA cards which have a | ||
502 | built-in OHCI-USB adapter and an internally-connected GSM modem. | ||
503 | The USB bus on these cards is not accessible externally. | ||
510 | 504 | ||
511 | These cards feature a built-in OHCI-USB adapter and an | 505 | Supported devices include (some of?) those made by: |
512 | internally-connected GSM modem. The USB bus is not | 506 | Option, Huawei, Audiovox, Sierra Wireless, Novatel Wireless, or |
513 | accessible externally. | 507 | Anydata. |
514 | 508 | ||
515 | To compile this driver as a module, choose M here: the | 509 | To compile this driver as a module, choose M here: the |
516 | module will be called option. | 510 | module will be called option. |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 35d4acc7f1d3..8efed2ce1ba3 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -12,7 +12,6 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o | |||
12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) | 12 | usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y) |
13 | 13 | ||
14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o | 14 | obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o |
15 | obj-$(CONFIG_USB_SERIAL_ANYDATA) += anydata.o | ||
16 | obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o | 15 | obj-$(CONFIG_USB_SERIAL_ARK3116) += ark3116.o |
17 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o | 16 | obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o |
18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o | 17 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o |
diff --git a/drivers/usb/serial/anydata.c b/drivers/usb/serial/anydata.c deleted file mode 100644 index 01843ef8c11e..000000000000 --- a/drivers/usb/serial/anydata.c +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | /* | ||
2 | * AnyData CDMA Serial USB driver | ||
3 | * | ||
4 | * Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/usb.h> | ||
16 | #include <linux/usb/serial.h> | ||
17 | |||
18 | static struct usb_device_id id_table [] = { | ||
19 | { USB_DEVICE(0x16d5, 0x6501) }, /* AirData CDMA device */ | ||
20 | { }, | ||
21 | }; | ||
22 | MODULE_DEVICE_TABLE(usb, id_table); | ||
23 | |||
24 | /* if overridden by the user, then use their value for the size of the | ||
25 | * read and write urbs */ | ||
26 | static int buffer_size; | ||
27 | static int debug; | ||
28 | |||
29 | static struct usb_driver anydata_driver = { | ||
30 | .name = "anydata", | ||
31 | .probe = usb_serial_probe, | ||
32 | .disconnect = usb_serial_disconnect, | ||
33 | .id_table = id_table, | ||
34 | .no_dynamic_id = 1, | ||
35 | }; | ||
36 | |||
37 | static int anydata_open(struct usb_serial_port *port, struct file *filp) | ||
38 | { | ||
39 | char *buffer; | ||
40 | int result = 0; | ||
41 | |||
42 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
43 | |||
44 | if (buffer_size) { | ||
45 | /* override the default buffer sizes */ | ||
46 | buffer = kmalloc(buffer_size, GFP_KERNEL); | ||
47 | if (!buffer) { | ||
48 | dev_err(&port->dev, "%s - out of memory.\n", | ||
49 | __FUNCTION__); | ||
50 | return -ENOMEM; | ||
51 | } | ||
52 | kfree (port->read_urb->transfer_buffer); | ||
53 | port->read_urb->transfer_buffer = buffer; | ||
54 | port->read_urb->transfer_buffer_length = buffer_size; | ||
55 | |||
56 | buffer = kmalloc(buffer_size, GFP_KERNEL); | ||
57 | if (!buffer) { | ||
58 | dev_err(&port->dev, "%s - out of memory.\n", | ||
59 | __FUNCTION__); | ||
60 | return -ENOMEM; | ||
61 | } | ||
62 | kfree (port->write_urb->transfer_buffer); | ||
63 | port->write_urb->transfer_buffer = buffer; | ||
64 | port->write_urb->transfer_buffer_length = buffer_size; | ||
65 | port->bulk_out_size = buffer_size; | ||
66 | } | ||
67 | |||
68 | /* Start reading from the device */ | ||
69 | usb_fill_bulk_urb(port->read_urb, port->serial->dev, | ||
70 | usb_rcvbulkpipe(port->serial->dev, | ||
71 | port->bulk_in_endpointAddress), | ||
72 | port->read_urb->transfer_buffer, | ||
73 | port->read_urb->transfer_buffer_length, | ||
74 | usb_serial_generic_read_bulk_callback, port); | ||
75 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
76 | if (result) | ||
77 | dev_err(&port->dev, | ||
78 | "%s - failed submitting read urb, error %d\n", | ||
79 | __FUNCTION__, result); | ||
80 | |||
81 | return result; | ||
82 | } | ||
83 | |||
84 | static struct usb_serial_driver anydata_device = { | ||
85 | .driver = { | ||
86 | .owner = THIS_MODULE, | ||
87 | .name = "anydata", | ||
88 | }, | ||
89 | .id_table = id_table, | ||
90 | .num_interrupt_in = NUM_DONT_CARE, | ||
91 | .num_bulk_in = NUM_DONT_CARE, | ||
92 | .num_bulk_out = NUM_DONT_CARE, | ||
93 | .num_ports = 1, | ||
94 | .open = anydata_open, | ||
95 | }; | ||
96 | |||
97 | static int __init anydata_init(void) | ||
98 | { | ||
99 | int retval; | ||
100 | |||
101 | retval = usb_serial_register(&anydata_device); | ||
102 | if (retval) | ||
103 | return retval; | ||
104 | retval = usb_register(&anydata_driver); | ||
105 | if (retval) | ||
106 | usb_serial_deregister(&anydata_device); | ||
107 | return retval; | ||
108 | } | ||
109 | |||
110 | static void __exit anydata_exit(void) | ||
111 | { | ||
112 | usb_deregister(&anydata_driver); | ||
113 | usb_serial_deregister(&anydata_device); | ||
114 | } | ||
115 | |||
116 | module_init(anydata_init); | ||
117 | module_exit(anydata_exit); | ||
118 | MODULE_LICENSE("GPL"); | ||
119 | |||
120 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
121 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | ||
122 | module_param(buffer_size, int, 0); | ||
123 | MODULE_PARM_DESC(buffer_size, "Size of the transfer buffers"); | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index b458aedc5fb6..a20da8528a5f 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -337,6 +337,7 @@ static struct usb_device_id id_table_combined [] = { | |||
337 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, | 337 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, |
338 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, | 338 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, |
339 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, | 339 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, |
340 | { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, | ||
340 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, | 341 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2101_PID) }, |
341 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, | 342 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2102_PID) }, |
342 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, | 343 | { USB_DEVICE(SEALEVEL_VID, SEALEVEL_2103_PID) }, |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 04ef90fcb876..9f7343a45424 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -182,6 +182,10 @@ | |||
182 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ | 182 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ |
183 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ | 183 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ |
184 | 184 | ||
185 | /* TNC-X USB-to-packet-radio adapter, versions prior to 3.0 (DLP module) */ | ||
186 | |||
187 | #define FTDI_TNC_X_PID 0xEBE0 | ||
188 | |||
185 | /* | 189 | /* |
186 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). | 190 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). |
187 | * All of these devices use FTDI's vendor ID (0x0403). | 191 | * All of these devices use FTDI's vendor ID (0x0403). |
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 59c5d999009a..7e1bd5d6dfa0 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
@@ -250,6 +250,7 @@ static struct usb_device_id ipaq_id_table [] = { | |||
250 | { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ | 250 | { USB_DEVICE(0x04C5, 0x1058) }, /* FUJITSU USB Sync */ |
251 | { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ | 251 | { USB_DEVICE(0x04C5, 0x1079) }, /* FUJITSU USB Sync */ |
252 | { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ | 252 | { USB_DEVICE(0x04DA, 0x2500) }, /* Panasonic USB Sync */ |
253 | { USB_DEVICE(0x04DD, 0x9102) }, /* SHARP WS003SH USB Modem */ | ||
253 | { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ | 254 | { USB_DEVICE(0x04E8, 0x5F00) }, /* Samsung NEXiO USB Sync */ |
254 | { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ | 255 | { USB_DEVICE(0x04E8, 0x5F01) }, /* Samsung NEXiO USB Sync */ |
255 | { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ | 256 | { USB_DEVICE(0x04E8, 0x5F02) }, /* Samsung NEXiO USB Sync */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index f0530c1d7b7a..c856e6f40e22 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -9,40 +9,14 @@ | |||
9 | 9 | ||
10 | Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> | 10 | Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> |
11 | 11 | ||
12 | History: | 12 | History: see the git log. |
13 | |||
14 | 2005-05-19 v0.1 Initial version, based on incomplete docs | ||
15 | and analysis of misbehavior with the standard driver | ||
16 | 2005-05-20 v0.2 Extended the input buffer to avoid losing | ||
17 | random 64-byte chunks of data | ||
18 | 2005-05-21 v0.3 implemented chars_in_buffer() | ||
19 | turned on low_latency | ||
20 | simplified the code somewhat | ||
21 | 2005-05-24 v0.4 option_write() sometimes deadlocked under heavy load | ||
22 | removed some dead code | ||
23 | added sponsor notice | ||
24 | coding style clean-up | ||
25 | 2005-06-20 v0.4.1 add missing braces :-/ | ||
26 | killed end-of-line whitespace | ||
27 | 2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2 | ||
28 | 2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard | ||
29 | 2005-09-20 v0.4.4 increased recv buffer size: the card sometimes | ||
30 | wants to send >2000 bytes. | ||
31 | 2006-04-10 v0.5 fixed two array overrun errors :-/ | ||
32 | 2006-04-21 v0.5.1 added support for Sierra Wireless MC8755 | ||
33 | 2006-05-15 v0.6 re-enable multi-port support | ||
34 | 2006-06-01 v0.6.1 add COBRA | ||
35 | 2006-06-01 v0.6.2 add backwards-compatibility stuff | ||
36 | 2006-06-01 v0.6.3 add Novatel Wireless | ||
37 | 2006-06-01 v0.7 Option => GSM | ||
38 | 2006-06-01 v0.7.1 add COBRA2 | ||
39 | 13 | ||
40 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> | 14 | Work sponsored by: Sigos GmbH, Germany <info@sigos.de> |
41 | 15 | ||
42 | This driver exists because the "normal" serial driver doesn't work too well | 16 | This driver exists because the "normal" serial driver doesn't work too well |
43 | with GSM modems. Issues: | 17 | with GSM modems. Issues: |
44 | - data loss -- one single Receive URB is not nearly enough | 18 | - data loss -- one single Receive URB is not nearly enough |
45 | - nonstandard flow (Option devices) and multiplex (Sierra) control | 19 | - nonstandard flow (Option devices) control |
46 | - controlling the baud rate doesn't make sense | 20 | - controlling the baud rate doesn't make sense |
47 | 21 | ||
48 | This driver is named "option" because the most common device it's | 22 | This driver is named "option" because the most common device it's |
@@ -96,8 +70,8 @@ static int option_send_setup(struct usb_serial_port *port); | |||
96 | #define OPTION_VENDOR_ID 0x0AF0 | 70 | #define OPTION_VENDOR_ID 0x0AF0 |
97 | #define HUAWEI_VENDOR_ID 0x12D1 | 71 | #define HUAWEI_VENDOR_ID 0x12D1 |
98 | #define AUDIOVOX_VENDOR_ID 0x0F3D | 72 | #define AUDIOVOX_VENDOR_ID 0x0F3D |
99 | #define SIERRAWIRELESS_VENDOR_ID 0x1199 | ||
100 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 73 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
74 | #define ANYDATA_VENDOR_ID 0x16d5 | ||
101 | 75 | ||
102 | #define OPTION_PRODUCT_OLD 0x5000 | 76 | #define OPTION_PRODUCT_OLD 0x5000 |
103 | #define OPTION_PRODUCT_FUSION 0x6000 | 77 | #define OPTION_PRODUCT_FUSION 0x6000 |
@@ -106,8 +80,8 @@ static int option_send_setup(struct usb_serial_port *port); | |||
106 | #define OPTION_PRODUCT_COBRA2 0x6600 | 80 | #define OPTION_PRODUCT_COBRA2 0x6600 |
107 | #define HUAWEI_PRODUCT_E600 0x1001 | 81 | #define HUAWEI_PRODUCT_E600 0x1001 |
108 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 | 82 | #define AUDIOVOX_PRODUCT_AIRCARD 0x0112 |
109 | #define SIERRAWIRELESS_PRODUCT_MC8755 0x6802 | ||
110 | #define NOVATELWIRELESS_PRODUCT_U740 0x1400 | 83 | #define NOVATELWIRELESS_PRODUCT_U740 0x1400 |
84 | #define ANYDATA_PRODUCT_ID 0x6501 | ||
111 | 85 | ||
112 | static struct usb_device_id option_ids[] = { | 86 | static struct usb_device_id option_ids[] = { |
113 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, | 87 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, |
@@ -117,8 +91,8 @@ static struct usb_device_id option_ids[] = { | |||
117 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, | 91 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) }, |
118 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 92 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
119 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 93 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
120 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | ||
121 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 94 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
95 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, | ||
122 | { } /* Terminating entry */ | 96 | { } /* Terminating entry */ |
123 | }; | 97 | }; |
124 | 98 | ||
@@ -131,10 +105,7 @@ static struct usb_device_id option_ids1[] = { | |||
131 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 105 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
132 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, | 106 | { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) }, |
133 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 107 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, |
134 | { } /* Terminating entry */ | 108 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, |
135 | }; | ||
136 | static struct usb_device_id option_ids3[] = { | ||
137 | { USB_DEVICE(SIERRAWIRELESS_VENDOR_ID, SIERRAWIRELESS_PRODUCT_MC8755) }, | ||
138 | { } /* Terminating entry */ | 109 | { } /* Terminating entry */ |
139 | }; | 110 | }; |
140 | 111 | ||
@@ -151,37 +122,11 @@ static struct usb_driver option_driver = { | |||
151 | /* The card has three separate interfaces, which the serial driver | 122 | /* The card has three separate interfaces, which the serial driver |
152 | * recognizes separately, thus num_port=1. | 123 | * recognizes separately, thus num_port=1. |
153 | */ | 124 | */ |
154 | static struct usb_serial_driver option_3port_device = { | ||
155 | .driver = { | ||
156 | .owner = THIS_MODULE, | ||
157 | .name = "option", | ||
158 | }, | ||
159 | .description = "GSM modem (3-port)", | ||
160 | .id_table = option_ids3, | ||
161 | .num_interrupt_in = NUM_DONT_CARE, | ||
162 | .num_bulk_in = NUM_DONT_CARE, | ||
163 | .num_bulk_out = NUM_DONT_CARE, | ||
164 | .num_ports = 3, | ||
165 | .open = option_open, | ||
166 | .close = option_close, | ||
167 | .write = option_write, | ||
168 | .write_room = option_write_room, | ||
169 | .chars_in_buffer = option_chars_in_buffer, | ||
170 | .throttle = option_rx_throttle, | ||
171 | .unthrottle = option_rx_unthrottle, | ||
172 | .set_termios = option_set_termios, | ||
173 | .break_ctl = option_break_ctl, | ||
174 | .tiocmget = option_tiocmget, | ||
175 | .tiocmset = option_tiocmset, | ||
176 | .attach = option_startup, | ||
177 | .shutdown = option_shutdown, | ||
178 | .read_int_callback = option_instat_callback, | ||
179 | }; | ||
180 | 125 | ||
181 | static struct usb_serial_driver option_1port_device = { | 126 | static struct usb_serial_driver option_1port_device = { |
182 | .driver = { | 127 | .driver = { |
183 | .owner = THIS_MODULE, | 128 | .owner = THIS_MODULE, |
184 | .name = "option", | 129 | .name = "option1", |
185 | }, | 130 | }, |
186 | .description = "GSM modem (1-port)", | 131 | .description = "GSM modem (1-port)", |
187 | .id_table = option_ids1, | 132 | .id_table = option_ids1, |
@@ -245,9 +190,6 @@ static int __init option_init(void) | |||
245 | retval = usb_serial_register(&option_1port_device); | 190 | retval = usb_serial_register(&option_1port_device); |
246 | if (retval) | 191 | if (retval) |
247 | goto failed_1port_device_register; | 192 | goto failed_1port_device_register; |
248 | retval = usb_serial_register(&option_3port_device); | ||
249 | if (retval) | ||
250 | goto failed_3port_device_register; | ||
251 | retval = usb_register(&option_driver); | 193 | retval = usb_register(&option_driver); |
252 | if (retval) | 194 | if (retval) |
253 | goto failed_driver_register; | 195 | goto failed_driver_register; |
@@ -257,8 +199,6 @@ static int __init option_init(void) | |||
257 | return 0; | 199 | return 0; |
258 | 200 | ||
259 | failed_driver_register: | 201 | failed_driver_register: |
260 | usb_serial_deregister (&option_3port_device); | ||
261 | failed_3port_device_register: | ||
262 | usb_serial_deregister (&option_1port_device); | 202 | usb_serial_deregister (&option_1port_device); |
263 | failed_1port_device_register: | 203 | failed_1port_device_register: |
264 | return retval; | 204 | return retval; |
@@ -267,7 +207,6 @@ failed_1port_device_register: | |||
267 | static void __exit option_exit(void) | 207 | static void __exit option_exit(void) |
268 | { | 208 | { |
269 | usb_deregister (&option_driver); | 209 | usb_deregister (&option_driver); |
270 | usb_serial_deregister (&option_3port_device); | ||
271 | usb_serial_deregister (&option_1port_device); | 210 | usb_serial_deregister (&option_1port_device); |
272 | } | 211 | } |
273 | 212 | ||
@@ -656,7 +595,6 @@ static void option_setup_urbs(struct usb_serial *serial) | |||
656 | 595 | ||
657 | dbg("%s", __FUNCTION__); | 596 | dbg("%s", __FUNCTION__); |
658 | 597 | ||
659 | |||
660 | for (i = 0; i < serial->num_ports; i++) { | 598 | for (i = 0; i < serial->num_ports; i++) { |
661 | port = serial->port[i]; | 599 | port = serial->port[i]; |
662 | portdata = usb_get_serial_port_data(port); | 600 | portdata = usb_get_serial_port_data(port); |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 259db31b65c1..efbbc0adb89a 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -81,6 +81,7 @@ static struct usb_device_id id_table [] = { | |||
81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, | 81 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, |
82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, | 82 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, |
83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, | 83 | { USB_DEVICE(DATAPILOT_U2_VENDOR_ID, DATAPILOT_U2_PRODUCT_ID) }, |
84 | { USB_DEVICE(BELKIN_VENDOR_ID, BELKIN_PRODUCT_ID) }, | ||
84 | { } /* Terminating entry */ | 85 | { } /* Terminating entry */ |
85 | }; | 86 | }; |
86 | 87 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index d9c1e6e0b4b3..a692ac66ca6c 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
@@ -89,3 +89,7 @@ | |||
89 | /* DATAPILOT Universal-2 Phone Cable */ | 89 | /* DATAPILOT Universal-2 Phone Cable */ |
90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 | 90 | #define DATAPILOT_U2_VENDOR_ID 0x0731 |
91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 | 91 | #define DATAPILOT_U2_PRODUCT_ID 0x2003 |
92 | |||
93 | /* Belkin "F5U257" Serial Adapter */ | ||
94 | #define BELKIN_VENDOR_ID 0x050d | ||
95 | #define BELKIN_PRODUCT_ID 0x0257 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index a5ca449f6e64..2793f9a912b4 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -145,6 +145,13 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
145 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 145 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
146 | US_FL_IGNORE_RESIDUE ), | 146 | US_FL_IGNORE_RESIDUE ), |
147 | 147 | ||
148 | /* Reported by Mario Rettig <mariorettig@web.de> */ | ||
149 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, | ||
150 | "Nokia", | ||
151 | "Nokia 3250", | ||
152 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
153 | US_FL_IGNORE_RESIDUE | US_FL_FIX_CAPACITY ), | ||
154 | |||
148 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and | 155 | /* Reported by Sumedha Swamy <sumedhaswamy@gmail.com> and |
149 | * Einar Th. Einarsson <einarthered@gmail.com> */ | 156 | * Einar Th. Einarsson <einarthered@gmail.com> */ |
150 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, | 157 | UNUSUAL_DEV( 0x0421, 0x0444, 0x0100, 0x0100, |
@@ -627,18 +634,6 @@ UNUSUAL_DEV( 0x0595, 0x4343, 0x0000, 0x2210, | |||
627 | "Digital Camera EX-20 DSC", | 634 | "Digital Camera EX-20 DSC", |
628 | US_SC_8070, US_PR_DEVICE, NULL, 0 ), | 635 | US_SC_8070, US_PR_DEVICE, NULL, 0 ), |
629 | 636 | ||
630 | /* The entry was here before I took over, and had US_SC_RBC. It turns | ||
631 | * out that isn't needed. Additionally, Torsten Eriksson | ||
632 | * <Torsten.Eriksson@bergianska.se> is able to use his device fine | ||
633 | * without this entry at all - but I don't suspect that will be true | ||
634 | * for all users (the protocol is likely needed), so is staying at | ||
635 | * this time. - Phil Dibowitz <phil@ipom.com> | ||
636 | */ | ||
637 | UNUSUAL_DEV( 0x059f, 0xa601, 0x0200, 0x0200, | ||
638 | "LaCie", | ||
639 | "USB Hard Disk", | ||
640 | US_SC_DEVICE, US_PR_CB, NULL, 0 ), | ||
641 | |||
642 | /* Submitted by Joel Bourquard <numlock@freesurf.ch> | 637 | /* Submitted by Joel Bourquard <numlock@freesurf.ch> |
643 | * Some versions of this device need the SubClass and Protocol overrides | 638 | * Some versions of this device need the SubClass and Protocol overrides |
644 | * while others don't. | 639 | * while others don't. |
@@ -1106,7 +1101,15 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff, | |||
1106 | "Optio S/S4", | 1101 | "Optio S/S4", |
1107 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1102 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1108 | US_FL_FIX_INQUIRY ), | 1103 | US_FL_FIX_INQUIRY ), |
1109 | 1104 | ||
1105 | /* This is a virtual windows driver CD, which the zd1211rw driver automatically | ||
1106 | * converts into a WLAN device. */ | ||
1107 | UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101, | ||
1108 | "ZyXEL", | ||
1109 | "G-220F USB-WLAN Install", | ||
1110 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1111 | US_FL_IGNORE_DEVICE ), | ||
1112 | |||
1110 | #ifdef CONFIG_USB_STORAGE_ISD200 | 1113 | #ifdef CONFIG_USB_STORAGE_ISD200 |
1111 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, | 1114 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, |
1112 | "ATI", | 1115 | "ATI", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 5ee19be52f65..8d7bdcb5924d 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -483,7 +483,7 @@ static struct us_unusual_dev *find_unusual(const struct usb_device_id *id) | |||
483 | } | 483 | } |
484 | 484 | ||
485 | /* Get the unusual_devs entries and the string descriptors */ | 485 | /* Get the unusual_devs entries and the string descriptors */ |
486 | static void get_device_info(struct us_data *us, const struct usb_device_id *id) | 486 | static int get_device_info(struct us_data *us, const struct usb_device_id *id) |
487 | { | 487 | { |
488 | struct usb_device *dev = us->pusb_dev; | 488 | struct usb_device *dev = us->pusb_dev; |
489 | struct usb_interface_descriptor *idesc = | 489 | struct usb_interface_descriptor *idesc = |
@@ -500,6 +500,11 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
500 | unusual_dev->useTransport; | 500 | unusual_dev->useTransport; |
501 | us->flags = USB_US_ORIG_FLAGS(id->driver_info); | 501 | us->flags = USB_US_ORIG_FLAGS(id->driver_info); |
502 | 502 | ||
503 | if (us->flags & US_FL_IGNORE_DEVICE) { | ||
504 | printk(KERN_INFO USB_STORAGE "device ignored\n"); | ||
505 | return -ENODEV; | ||
506 | } | ||
507 | |||
503 | /* | 508 | /* |
504 | * This flag is only needed when we're in high-speed, so let's | 509 | * This flag is only needed when we're in high-speed, so let's |
505 | * disable it if we're in full-speed | 510 | * disable it if we're in full-speed |
@@ -541,6 +546,8 @@ static void get_device_info(struct us_data *us, const struct usb_device_id *id) | |||
541 | msgs[msg], | 546 | msgs[msg], |
542 | UTS_RELEASE); | 547 | UTS_RELEASE); |
543 | } | 548 | } |
549 | |||
550 | return 0; | ||
544 | } | 551 | } |
545 | 552 | ||
546 | /* Get the transport settings */ | 553 | /* Get the transport settings */ |
@@ -969,7 +976,9 @@ static int storage_probe(struct usb_interface *intf, | |||
969 | * of the match from the usb_device_id table, so we can find the | 976 | * of the match from the usb_device_id table, so we can find the |
970 | * corresponding entry in the private table. | 977 | * corresponding entry in the private table. |
971 | */ | 978 | */ |
972 | get_device_info(us, id); | 979 | result = get_device_info(us, id); |
980 | if (result) | ||
981 | goto BadDevice; | ||
973 | 982 | ||
974 | /* Get the transport, protocol, and pipe settings */ | 983 | /* Get the transport, protocol, and pipe settings */ |
975 | result = get_transport(us); | 984 | result = get_transport(us); |