diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-02-24 18:39:54 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-02-24 18:39:54 -0500 |
| commit | a792cd12cf07cf77c7d1d41b46b4f8327ecf82d0 (patch) | |
| tree | 27acf59615245ac2b990fc45e99ce91775767e41 /drivers/ieee1394 | |
| parent | 4daa0682af15b24e9d66ccde3a5d502682e572d8 (diff) | |
| parent | e73bf9f135fe1e5db646e668676d22af3008e0c0 (diff) | |
Merge branch 'firedtv-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'firedtv-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
firedtv: dvb_frontend_info for FireDTV S2, fix "frequency limits undefined" error
firedtv: massive refactoring
firedtv: rename files, variables, functions from firesat to firedtv
firedtv: Use DEFINE_SPINLOCK
firedtv: fix registration - adapter number could only be zero
firedtv: use length_field() of PMT as length
firedtv: fix returned struct for ca_info
firedtv: cleanups and minor fixes
ieee1394: remove superfluous assertions
ieee1394: inherit ud vendor_id from node vendor_id
ieee1394: add hpsb_node_read() and hpsb_node_lock()
ieee1394: use correct barrier types between accesses of nodeid and generation
firesat: copyrights, rename to firedtv, API conversions, fix remote control input
firesat: avc resend
firesat: update isochronous interface, add CI support
firesat: add DVB-S support for DVB-S2 devices
firesat: fix DVB-S2 device recognition
DVB: add firesat driver
Diffstat (limited to 'drivers/ieee1394')
| -rw-r--r-- | drivers/ieee1394/dma.h | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_core.c | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_transactions.c | 31 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_transactions.h | 2 | ||||
| -rw-r--r-- | drivers/ieee1394/iso.h | 1 | ||||
| -rw-r--r-- | drivers/ieee1394/nodemgr.c | 10 | ||||
| -rw-r--r-- | drivers/ieee1394/nodemgr.h | 18 |
7 files changed, 57 insertions, 7 deletions
diff --git a/drivers/ieee1394/dma.h b/drivers/ieee1394/dma.h index 2727bcd24194..467373cab8e5 100644 --- a/drivers/ieee1394/dma.h +++ b/drivers/ieee1394/dma.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm/types.h> | 13 | #include <asm/types.h> |
| 14 | 14 | ||
| 15 | struct file; | ||
| 15 | struct pci_dev; | 16 | struct pci_dev; |
| 16 | struct scatterlist; | 17 | struct scatterlist; |
| 17 | struct vm_area_struct; | 18 | struct vm_area_struct; |
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index 2beb8d94f7bd..1028e725a27e 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c | |||
| @@ -1314,6 +1314,7 @@ EXPORT_SYMBOL(hpsb_make_lock64packet); | |||
| 1314 | EXPORT_SYMBOL(hpsb_make_phypacket); | 1314 | EXPORT_SYMBOL(hpsb_make_phypacket); |
| 1315 | EXPORT_SYMBOL(hpsb_read); | 1315 | EXPORT_SYMBOL(hpsb_read); |
| 1316 | EXPORT_SYMBOL(hpsb_write); | 1316 | EXPORT_SYMBOL(hpsb_write); |
| 1317 | EXPORT_SYMBOL(hpsb_lock); | ||
| 1317 | EXPORT_SYMBOL(hpsb_packet_success); | 1318 | EXPORT_SYMBOL(hpsb_packet_success); |
| 1318 | 1319 | ||
| 1319 | /** highlevel.c **/ | 1320 | /** highlevel.c **/ |
diff --git a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c index 10c3d9f8c038..675b3135d5f1 100644 --- a/drivers/ieee1394/ieee1394_transactions.c +++ b/drivers/ieee1394/ieee1394_transactions.c | |||
| @@ -501,8 +501,6 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation, | |||
| 501 | if (length == 0) | 501 | if (length == 0) |
| 502 | return -EINVAL; | 502 | return -EINVAL; |
| 503 | 503 | ||
| 504 | BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet | ||
| 505 | |||
| 506 | packet = hpsb_make_readpacket(host, node, addr, length); | 504 | packet = hpsb_make_readpacket(host, node, addr, length); |
| 507 | 505 | ||
| 508 | if (!packet) { | 506 | if (!packet) { |
| @@ -550,8 +548,6 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation, | |||
| 550 | if (length == 0) | 548 | if (length == 0) |
| 551 | return -EINVAL; | 549 | return -EINVAL; |
| 552 | 550 | ||
| 553 | BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet | ||
| 554 | |||
| 555 | packet = hpsb_make_writepacket(host, node, addr, buffer, length); | 551 | packet = hpsb_make_writepacket(host, node, addr, buffer, length); |
| 556 | 552 | ||
| 557 | if (!packet) | 553 | if (!packet) |
| @@ -570,3 +566,30 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation, | |||
| 570 | 566 | ||
| 571 | return retval; | 567 | return retval; |
| 572 | } | 568 | } |
| 569 | |||
| 570 | int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation, | ||
| 571 | u64 addr, int extcode, quadlet_t *data, quadlet_t arg) | ||
| 572 | { | ||
| 573 | struct hpsb_packet *packet; | ||
| 574 | int retval = 0; | ||
| 575 | |||
| 576 | packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg); | ||
| 577 | if (!packet) | ||
| 578 | return -ENOMEM; | ||
| 579 | |||
| 580 | packet->generation = generation; | ||
| 581 | retval = hpsb_send_packet_and_wait(packet); | ||
| 582 | if (retval < 0) | ||
| 583 | goto hpsb_lock_fail; | ||
| 584 | |||
| 585 | retval = hpsb_packet_success(packet); | ||
| 586 | |||
| 587 | if (retval == 0) | ||
| 588 | *data = packet->data[0]; | ||
| 589 | |||
| 590 | hpsb_lock_fail: | ||
| 591 | hpsb_free_tlabel(packet); | ||
| 592 | hpsb_free_packet(packet); | ||
| 593 | |||
| 594 | return retval; | ||
| 595 | } | ||
diff --git a/drivers/ieee1394/ieee1394_transactions.h b/drivers/ieee1394/ieee1394_transactions.h index d2d5bc3546d7..20b693be14b2 100644 --- a/drivers/ieee1394/ieee1394_transactions.h +++ b/drivers/ieee1394/ieee1394_transactions.h | |||
| @@ -30,6 +30,8 @@ int hpsb_read(struct hpsb_host *host, nodeid_t node, unsigned int generation, | |||
| 30 | u64 addr, quadlet_t *buffer, size_t length); | 30 | u64 addr, quadlet_t *buffer, size_t length); |
| 31 | int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation, | 31 | int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation, |
| 32 | u64 addr, quadlet_t *buffer, size_t length); | 32 | u64 addr, quadlet_t *buffer, size_t length); |
| 33 | int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation, | ||
| 34 | u64 addr, int extcode, quadlet_t *data, quadlet_t arg); | ||
| 33 | 35 | ||
| 34 | #ifdef HPSB_DEBUG_TLABELS | 36 | #ifdef HPSB_DEBUG_TLABELS |
| 35 | extern spinlock_t hpsb_tlabel_lock; | 37 | extern spinlock_t hpsb_tlabel_lock; |
diff --git a/drivers/ieee1394/iso.h b/drivers/ieee1394/iso.h index b5de5f21ef78..c2089c093aa7 100644 --- a/drivers/ieee1394/iso.h +++ b/drivers/ieee1394/iso.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define IEEE1394_ISO_H | 13 | #define IEEE1394_ISO_H |
| 14 | 14 | ||
| 15 | #include <linux/spinlock_types.h> | 15 | #include <linux/spinlock_types.h> |
| 16 | #include <linux/wait.h> | ||
| 16 | #include <asm/atomic.h> | 17 | #include <asm/atomic.h> |
| 17 | #include <asm/types.h> | 18 | #include <asm/types.h> |
| 18 | 19 | ||
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 906c5a98d814..53aada5bbe1e 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
| @@ -971,6 +971,9 @@ static struct unit_directory *nodemgr_process_unit_directory | |||
| 971 | ud->ud_kv = ud_kv; | 971 | ud->ud_kv = ud_kv; |
| 972 | ud->id = (*id)++; | 972 | ud->id = (*id)++; |
| 973 | 973 | ||
| 974 | /* inherit vendor_id from root directory if none exists in unit dir */ | ||
| 975 | ud->vendor_id = ne->vendor_id; | ||
| 976 | |||
| 974 | csr1212_for_each_dir_entry(ne->csr, kv, ud_kv, dentry) { | 977 | csr1212_for_each_dir_entry(ne->csr, kv, ud_kv, dentry) { |
| 975 | switch (kv->key.id) { | 978 | switch (kv->key.id) { |
| 976 | case CSR1212_KV_ID_VENDOR: | 979 | case CSR1212_KV_ID_VENDOR: |
| @@ -1265,7 +1268,8 @@ static void nodemgr_update_node(struct node_entry *ne, struct csr1212_csr *csr, | |||
| 1265 | csr1212_destroy_csr(csr); | 1268 | csr1212_destroy_csr(csr); |
| 1266 | } | 1269 | } |
| 1267 | 1270 | ||
| 1268 | /* Mark the node current */ | 1271 | /* Finally, mark the node current */ |
| 1272 | smp_wmb(); | ||
| 1269 | ne->generation = generation; | 1273 | ne->generation = generation; |
| 1270 | 1274 | ||
| 1271 | if (ne->in_limbo) { | 1275 | if (ne->in_limbo) { |
| @@ -1798,7 +1802,7 @@ void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *packet) | |||
| 1798 | { | 1802 | { |
| 1799 | packet->host = ne->host; | 1803 | packet->host = ne->host; |
| 1800 | packet->generation = ne->generation; | 1804 | packet->generation = ne->generation; |
| 1801 | barrier(); | 1805 | smp_rmb(); |
| 1802 | packet->node_id = ne->nodeid; | 1806 | packet->node_id = ne->nodeid; |
| 1803 | } | 1807 | } |
| 1804 | 1808 | ||
| @@ -1807,7 +1811,7 @@ int hpsb_node_write(struct node_entry *ne, u64 addr, | |||
| 1807 | { | 1811 | { |
| 1808 | unsigned int generation = ne->generation; | 1812 | unsigned int generation = ne->generation; |
| 1809 | 1813 | ||
| 1810 | barrier(); | 1814 | smp_rmb(); |
| 1811 | return hpsb_write(ne->host, ne->nodeid, generation, | 1815 | return hpsb_write(ne->host, ne->nodeid, generation, |
| 1812 | addr, buffer, length); | 1816 | addr, buffer, length); |
| 1813 | } | 1817 | } |
diff --git a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h index 15ea09733e84..ee5acdbd114a 100644 --- a/drivers/ieee1394/nodemgr.h +++ b/drivers/ieee1394/nodemgr.h | |||
| @@ -21,9 +21,11 @@ | |||
| 21 | #define _IEEE1394_NODEMGR_H | 21 | #define _IEEE1394_NODEMGR_H |
| 22 | 22 | ||
| 23 | #include <linux/device.h> | 23 | #include <linux/device.h> |
| 24 | #include <asm/system.h> | ||
| 24 | #include <asm/types.h> | 25 | #include <asm/types.h> |
| 25 | 26 | ||
| 26 | #include "ieee1394_core.h" | 27 | #include "ieee1394_core.h" |
| 28 | #include "ieee1394_transactions.h" | ||
| 27 | #include "ieee1394_types.h" | 29 | #include "ieee1394_types.h" |
| 28 | 30 | ||
| 29 | struct csr1212_csr; | 31 | struct csr1212_csr; |
| @@ -154,6 +156,22 @@ static inline int hpsb_node_entry_valid(struct node_entry *ne) | |||
| 154 | void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *packet); | 156 | void hpsb_node_fill_packet(struct node_entry *ne, struct hpsb_packet *packet); |
| 155 | int hpsb_node_write(struct node_entry *ne, u64 addr, | 157 | int hpsb_node_write(struct node_entry *ne, u64 addr, |
| 156 | quadlet_t *buffer, size_t length); | 158 | quadlet_t *buffer, size_t length); |
| 159 | static inline int hpsb_node_read(struct node_entry *ne, u64 addr, | ||
| 160 | quadlet_t *buffer, size_t length) | ||
| 161 | { | ||
| 162 | unsigned int g = ne->generation; | ||
| 163 | |||
| 164 | smp_rmb(); | ||
| 165 | return hpsb_read(ne->host, ne->nodeid, g, addr, buffer, length); | ||
| 166 | } | ||
| 167 | static inline int hpsb_node_lock(struct node_entry *ne, u64 addr, int extcode, | ||
| 168 | quadlet_t *buffer, quadlet_t arg) | ||
| 169 | { | ||
| 170 | unsigned int g = ne->generation; | ||
| 171 | |||
| 172 | smp_rmb(); | ||
| 173 | return hpsb_lock(ne->host, ne->nodeid, g, addr, extcode, buffer, arg); | ||
| 174 | } | ||
| 157 | int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *)); | 175 | int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *)); |
| 158 | 176 | ||
| 159 | int init_ieee1394_nodemgr(void); | 177 | int init_ieee1394_nodemgr(void); |
