diff options
| -rw-r--r-- | Documentation/ABI/removed/raw1394_legacy_isochronous | 16 | ||||
| -rw-r--r-- | Documentation/feature-removal-schedule.txt | 10 | ||||
| -rw-r--r-- | drivers/ieee1394/highlevel.c | 45 | ||||
| -rw-r--r-- | drivers/ieee1394/highlevel.h | 16 | ||||
| -rw-r--r-- | drivers/ieee1394/hosts.h | 8 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_core.c | 8 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_core.h | 5 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_transactions.c | 30 | ||||
| -rw-r--r-- | drivers/ieee1394/ieee1394_transactions.h | 2 | ||||
| -rw-r--r-- | drivers/ieee1394/ohci1394.c | 221 | ||||
| -rw-r--r-- | drivers/ieee1394/ohci1394.h | 14 | ||||
| -rw-r--r-- | drivers/ieee1394/pcilynx.c | 16 | ||||
| -rw-r--r-- | drivers/ieee1394/raw1394-private.h | 5 | ||||
| -rw-r--r-- | drivers/ieee1394/raw1394.c | 176 | ||||
| -rw-r--r-- | drivers/ieee1394/raw1394.h | 4 |
15 files changed, 48 insertions, 528 deletions
diff --git a/Documentation/ABI/removed/raw1394_legacy_isochronous b/Documentation/ABI/removed/raw1394_legacy_isochronous new file mode 100644 index 00000000000..1b629622d88 --- /dev/null +++ b/Documentation/ABI/removed/raw1394_legacy_isochronous | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | What: legacy isochronous ABI of raw1394 (1st generation iso ABI) | ||
| 2 | Date: June 2007 (scheduled), removed in kernel v2.6.23 | ||
| 3 | Contact: linux1394-devel@lists.sourceforge.net | ||
| 4 | Description: | ||
| 5 | The two request types RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN have | ||
| 6 | been deprecated for quite some time. They are very inefficient as they | ||
| 7 | come with high interrupt load and several layers of callbacks for each | ||
| 8 | packet. Because of these deficiencies, the video1394 and dv1394 drivers | ||
| 9 | and the 3rd-generation isochronous ABI in raw1394 (rawiso) were created. | ||
| 10 | |||
| 11 | Users: | ||
| 12 | libraw1394 users via the long deprecated API raw1394_iso_write, | ||
| 13 | raw1394_start_iso_write, raw1394_start_iso_rcv, raw1394_stop_iso_rcv | ||
| 14 | |||
| 15 | libdc1394, which optionally uses these old libraw1394 calls | ||
| 16 | alternatively to the more efficient video1394 ABI | ||
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 7d3f205b0ba..51b369e7fc7 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -49,16 +49,6 @@ Who: Adrian Bunk <bunk@stusta.de> | |||
| 49 | 49 | ||
| 50 | --------------------------- | 50 | --------------------------- |
| 51 | 51 | ||
| 52 | What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN | ||
| 53 | When: June 2007 | ||
| 54 | Why: Deprecated in favour of the more efficient and robust rawiso interface. | ||
| 55 | Affected are applications which use the deprecated part of libraw1394 | ||
| 56 | (raw1394_iso_write, raw1394_start_iso_write, raw1394_start_iso_rcv, | ||
| 57 | raw1394_stop_iso_rcv) or bypass libraw1394. | ||
| 58 | Who: Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de> | ||
| 59 | |||
| 60 | --------------------------- | ||
| 61 | |||
| 62 | What: old NCR53C9x driver | 52 | What: old NCR53C9x driver |
| 63 | When: October 2007 | 53 | When: October 2007 |
| 64 | Why: Replaced by the much better esp_scsi driver. Actual low-level | 54 | Why: Replaced by the much better esp_scsi driver. Actual low-level |
diff --git a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c index 83a49331275..b6425469b6e 100644 --- a/drivers/ieee1394/highlevel.c +++ b/drivers/ieee1394/highlevel.c | |||
| @@ -483,37 +483,6 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | |||
| 483 | return retval; | 483 | return retval; |
| 484 | } | 484 | } |
| 485 | 485 | ||
| 486 | /** | ||
| 487 | * hpsb_listen_channel - enable receving a certain isochronous channel | ||
| 488 | * | ||
| 489 | * Reception is handled through the @hl's iso_receive op. | ||
| 490 | */ | ||
| 491 | int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, | ||
| 492 | unsigned int channel) | ||
| 493 | { | ||
| 494 | if (channel > 63) { | ||
| 495 | HPSB_ERR("%s called with invalid channel", __FUNCTION__); | ||
| 496 | return -EINVAL; | ||
| 497 | } | ||
| 498 | if (host->iso_listen_count[channel]++ == 0) | ||
| 499 | return host->driver->devctl(host, ISO_LISTEN_CHANNEL, channel); | ||
| 500 | return 0; | ||
| 501 | } | ||
| 502 | |||
| 503 | /** | ||
| 504 | * hpsb_unlisten_channel - disable receving a certain isochronous channel | ||
| 505 | */ | ||
| 506 | void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, | ||
| 507 | unsigned int channel) | ||
| 508 | { | ||
| 509 | if (channel > 63) { | ||
| 510 | HPSB_ERR("%s called with invalid channel", __FUNCTION__); | ||
| 511 | return; | ||
| 512 | } | ||
| 513 | if (--host->iso_listen_count[channel] == 0) | ||
| 514 | host->driver->devctl(host, ISO_UNLISTEN_CHANNEL, channel); | ||
| 515 | } | ||
| 516 | |||
| 517 | static void init_hpsb_highlevel(struct hpsb_host *host) | 486 | static void init_hpsb_highlevel(struct hpsb_host *host) |
| 518 | { | 487 | { |
| 519 | INIT_LIST_HEAD(&dummy_zero_addr.host_list); | 488 | INIT_LIST_HEAD(&dummy_zero_addr.host_list); |
| @@ -570,20 +539,6 @@ void highlevel_host_reset(struct hpsb_host *host) | |||
| 570 | read_unlock_irqrestore(&hl_irqs_lock, flags); | 539 | read_unlock_irqrestore(&hl_irqs_lock, flags); |
| 571 | } | 540 | } |
| 572 | 541 | ||
| 573 | void highlevel_iso_receive(struct hpsb_host *host, void *data, size_t length) | ||
| 574 | { | ||
| 575 | unsigned long flags; | ||
| 576 | struct hpsb_highlevel *hl; | ||
| 577 | int channel = (((quadlet_t *)data)[0] >> 8) & 0x3f; | ||
| 578 | |||
| 579 | read_lock_irqsave(&hl_irqs_lock, flags); | ||
| 580 | list_for_each_entry(hl, &hl_irqs, irq_list) { | ||
| 581 | if (hl->iso_receive) | ||
| 582 | hl->iso_receive(host, channel, data, length); | ||
| 583 | } | ||
| 584 | read_unlock_irqrestore(&hl_irqs_lock, flags); | ||
| 585 | } | ||
| 586 | |||
| 587 | void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, | 542 | void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, |
| 588 | void *data, size_t length) | 543 | void *data, size_t length) |
| 589 | { | 544 | { |
diff --git a/drivers/ieee1394/highlevel.h b/drivers/ieee1394/highlevel.h index 63474f7ee69..eb9fe321e09 100644 --- a/drivers/ieee1394/highlevel.h +++ b/drivers/ieee1394/highlevel.h | |||
| @@ -26,9 +26,7 @@ struct hpsb_address_serve { | |||
| 26 | struct hpsb_highlevel { | 26 | struct hpsb_highlevel { |
| 27 | const char *name; | 27 | const char *name; |
| 28 | 28 | ||
| 29 | /* Any of the following pointers can legally be NULL, except for | 29 | /* Any of the following pointers can legally be NULL. */ |
| 30 | * iso_receive which can only be NULL when you don't request | ||
| 31 | * channels. */ | ||
| 32 | 30 | ||
| 33 | /* New host initialized. Will also be called during | 31 | /* New host initialized. Will also be called during |
| 34 | * hpsb_register_highlevel for all hosts already installed. */ | 32 | * hpsb_register_highlevel for all hosts already installed. */ |
| @@ -43,13 +41,6 @@ struct hpsb_highlevel { | |||
| 43 | * You can not expect to be able to do stock hpsb_reads. */ | 41 | * You can not expect to be able to do stock hpsb_reads. */ |
| 44 | void (*host_reset)(struct hpsb_host *host); | 42 | void (*host_reset)(struct hpsb_host *host); |
| 45 | 43 | ||
| 46 | /* An isochronous packet was received. Channel contains the channel | ||
| 47 | * number for your convenience, it is also contained in the included | ||
| 48 | * packet header (first quadlet, CRCs are missing). You may get called | ||
| 49 | * for channel/host combinations you did not request. */ | ||
| 50 | void (*iso_receive)(struct hpsb_host *host, int channel, | ||
| 51 | quadlet_t *data, size_t length); | ||
| 52 | |||
| 53 | /* A write request was received on either the FCP_COMMAND (direction = | 44 | /* A write request was received on either the FCP_COMMAND (direction = |
| 54 | * 0) or the FCP_RESPONSE (direction = 1) register. The cts arg | 45 | * 0) or the FCP_RESPONSE (direction = 1) register. The cts arg |
| 55 | * contains the cts field (first byte of data). */ | 46 | * contains the cts field (first byte of data). */ |
| @@ -109,7 +100,6 @@ int highlevel_lock(struct hpsb_host *host, int nodeid, quadlet_t *store, | |||
| 109 | int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store, | 100 | int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store, |
| 110 | u64 addr, octlet_t data, octlet_t arg, int ext_tcode, | 101 | u64 addr, octlet_t data, octlet_t arg, int ext_tcode, |
| 111 | u16 flags); | 102 | u16 flags); |
| 112 | void highlevel_iso_receive(struct hpsb_host *host, void *data, size_t length); | ||
| 113 | void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, | 103 | void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction, |
| 114 | void *data, size_t length); | 104 | void *data, size_t length); |
| 115 | 105 | ||
| @@ -125,10 +115,6 @@ int hpsb_register_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | |||
| 125 | struct hpsb_address_ops *ops, u64 start, u64 end); | 115 | struct hpsb_address_ops *ops, u64 start, u64 end); |
| 126 | int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, | 116 | int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host, |
| 127 | u64 start); | 117 | u64 start); |
| 128 | int hpsb_listen_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, | ||
| 129 | unsigned int channel); | ||
| 130 | void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host, | ||
| 131 | unsigned int channel); | ||
| 132 | 118 | ||
| 133 | void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host); | 119 | void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host); |
| 134 | void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, | 120 | void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, |
diff --git a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h index 979fd190f60..e4e8aeb4d77 100644 --- a/drivers/ieee1394/hosts.h +++ b/drivers/ieee1394/hosts.h | |||
| @@ -28,8 +28,6 @@ struct hpsb_host { | |||
| 28 | struct timer_list timeout; | 28 | struct timer_list timeout; |
| 29 | unsigned long timeout_interval; | 29 | unsigned long timeout_interval; |
| 30 | 30 | ||
| 31 | unsigned char iso_listen_count[64]; | ||
| 32 | |||
| 33 | int node_count; /* number of identified nodes on this bus */ | 31 | int node_count; /* number of identified nodes on this bus */ |
| 34 | int selfid_count; /* total number of SelfIDs received */ | 32 | int selfid_count; /* total number of SelfIDs received */ |
| 35 | int nodes_active; /* number of nodes with active link layer */ | 33 | int nodes_active; /* number of nodes with active link layer */ |
| @@ -99,12 +97,6 @@ enum devctl_cmd { | |||
| 99 | /* Cancel all outstanding async requests without resetting the bus. | 97 | /* Cancel all outstanding async requests without resetting the bus. |
| 100 | * Return void. */ | 98 | * Return void. */ |
| 101 | CANCEL_REQUESTS, | 99 | CANCEL_REQUESTS, |
| 102 | |||
| 103 | /* Start or stop receiving isochronous channel in arg. Return void. | ||
| 104 | * This acts as an optimization hint, hosts are not required not to | ||
| 105 | * listen on unrequested channels. */ | ||
| 106 | ISO_LISTEN_CHANNEL, | ||
| 107 | ISO_UNLISTEN_CHANNEL | ||
| 108 | }; | 100 | }; |
| 109 | 101 | ||
| 110 | enum isoctl_cmd { | 102 | enum isoctl_cmd { |
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index 8f71b6a06aa..0fc8c6e559e 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c | |||
| @@ -1028,11 +1028,6 @@ void hpsb_packet_received(struct hpsb_host *host, quadlet_t *data, size_t size, | |||
| 1028 | handle_incoming_packet(host, tcode, data, size, write_acked); | 1028 | handle_incoming_packet(host, tcode, data, size, write_acked); |
| 1029 | break; | 1029 | break; |
| 1030 | 1030 | ||
| 1031 | |||
| 1032 | case TCODE_ISO_DATA: | ||
| 1033 | highlevel_iso_receive(host, data, size); | ||
| 1034 | break; | ||
| 1035 | |||
| 1036 | case TCODE_CYCLE_START: | 1031 | case TCODE_CYCLE_START: |
| 1037 | /* simply ignore this packet if it is passed on */ | 1032 | /* simply ignore this packet if it is passed on */ |
| 1038 | break; | 1033 | break; |
| @@ -1316,7 +1311,6 @@ EXPORT_SYMBOL(hpsb_make_streampacket); | |||
| 1316 | EXPORT_SYMBOL(hpsb_make_lockpacket); | 1311 | EXPORT_SYMBOL(hpsb_make_lockpacket); |
| 1317 | EXPORT_SYMBOL(hpsb_make_lock64packet); | 1312 | EXPORT_SYMBOL(hpsb_make_lock64packet); |
| 1318 | EXPORT_SYMBOL(hpsb_make_phypacket); | 1313 | EXPORT_SYMBOL(hpsb_make_phypacket); |
| 1319 | EXPORT_SYMBOL(hpsb_make_isopacket); | ||
| 1320 | EXPORT_SYMBOL(hpsb_read); | 1314 | EXPORT_SYMBOL(hpsb_read); |
| 1321 | EXPORT_SYMBOL(hpsb_write); | 1315 | EXPORT_SYMBOL(hpsb_write); |
| 1322 | EXPORT_SYMBOL(hpsb_packet_success); | 1316 | EXPORT_SYMBOL(hpsb_packet_success); |
| @@ -1327,8 +1321,6 @@ EXPORT_SYMBOL(hpsb_unregister_highlevel); | |||
| 1327 | EXPORT_SYMBOL(hpsb_register_addrspace); | 1321 | EXPORT_SYMBOL(hpsb_register_addrspace); |
| 1328 | EXPORT_SYMBOL(hpsb_unregister_addrspace); | 1322 | EXPORT_SYMBOL(hpsb_unregister_addrspace); |
| 1329 | EXPORT_SYMBOL(hpsb_allocate_and_register_addrspace); | 1323 | EXPORT_SYMBOL(hpsb_allocate_and_register_addrspace); |
| 1330 | EXPORT_SYMBOL(hpsb_listen_channel); | ||
| 1331 | EXPORT_SYMBOL(hpsb_unlisten_channel); | ||
| 1332 | EXPORT_SYMBOL(hpsb_get_hostinfo); | 1324 | EXPORT_SYMBOL(hpsb_get_hostinfo); |
| 1333 | EXPORT_SYMBOL(hpsb_create_hostinfo); | 1325 | EXPORT_SYMBOL(hpsb_create_hostinfo); |
| 1334 | EXPORT_SYMBOL(hpsb_destroy_hostinfo); | 1326 | EXPORT_SYMBOL(hpsb_destroy_hostinfo); |
diff --git a/drivers/ieee1394/ieee1394_core.h b/drivers/ieee1394/ieee1394_core.h index 11fd324ee04..21d50f73a21 100644 --- a/drivers/ieee1394/ieee1394_core.h +++ b/drivers/ieee1394/ieee1394_core.h | |||
| @@ -24,9 +24,8 @@ struct hpsb_packet { | |||
| 24 | 24 | ||
| 25 | nodeid_t node_id; | 25 | nodeid_t node_id; |
| 26 | 26 | ||
| 27 | /* Async and Iso types should be clear, raw means send-as-is, do not | 27 | /* hpsb_raw = send as-is, do not CRC (but still byte-swap it) */ |
| 28 | * CRC! Byte swapping shall still be done in this case. */ | 28 | enum { hpsb_async, hpsb_raw } __attribute__((packed)) type; |
| 29 | enum { hpsb_async, hpsb_iso, hpsb_raw } __attribute__((packed)) type; | ||
| 30 | 29 | ||
| 31 | /* Okay, this is core internal and a no care for hosts. | 30 | /* Okay, this is core internal and a no care for hosts. |
| 32 | * queued = queued for sending | 31 | * queued = queued for sending |
diff --git a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c index 40078ce930c..c39c70a8aa9 100644 --- a/drivers/ieee1394/ieee1394_transactions.c +++ b/drivers/ieee1394/ieee1394_transactions.c | |||
| @@ -89,18 +89,6 @@ static void fill_async_lock(struct hpsb_packet *packet, u64 addr, int extcode, | |||
| 89 | packet->expect_response = 1; | 89 | packet->expect_response = 1; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | static void fill_iso_packet(struct hpsb_packet *packet, int length, int channel, | ||
| 93 | int tag, int sync) | ||
| 94 | { | ||
| 95 | packet->header[0] = (length << 16) | (tag << 14) | (channel << 8) | ||
| 96 | | (TCODE_ISO_DATA << 4) | sync; | ||
| 97 | |||
| 98 | packet->header_size = 4; | ||
| 99 | packet->data_size = length; | ||
| 100 | packet->type = hpsb_iso; | ||
| 101 | packet->tcode = TCODE_ISO_DATA; | ||
| 102 | } | ||
| 103 | |||
| 104 | static void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data) | 92 | static void fill_phy_packet(struct hpsb_packet *packet, quadlet_t data) |
| 105 | { | 93 | { |
| 106 | packet->header[0] = data; | 94 | packet->header[0] = data; |
| @@ -491,24 +479,6 @@ struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host, quadlet_t data) | |||
| 491 | return p; | 479 | return p; |
| 492 | } | 480 | } |
| 493 | 481 | ||
| 494 | struct hpsb_packet *hpsb_make_isopacket(struct hpsb_host *host, | ||
| 495 | int length, int channel, | ||
| 496 | int tag, int sync) | ||
| 497 | { | ||
| 498 | struct hpsb_packet *p; | ||
| 499 | |||
| 500 | p = hpsb_alloc_packet(length); | ||
| 501 | if (!p) | ||
| 502 | return NULL; | ||
| 503 | |||
| 504 | p->host = host; | ||
| 505 | fill_iso_packet(p, length, channel, tag, sync); | ||
| 506 | |||
| 507 | p->generation = get_hpsb_generation(host); | ||
| 508 | |||
| 509 | return p; | ||
| 510 | } | ||
| 511 | |||
| 512 | /* | 482 | /* |
| 513 | * FIXME - these functions should probably read from / write to user space to | 483 | * FIXME - these functions should probably read from / write to user space to |
| 514 | * avoid in kernel buffers for user space callers | 484 | * avoid in kernel buffers for user space callers |
diff --git a/drivers/ieee1394/ieee1394_transactions.h b/drivers/ieee1394/ieee1394_transactions.h index 86b8ee692ea..d2d5bc3546d 100644 --- a/drivers/ieee1394/ieee1394_transactions.h +++ b/drivers/ieee1394/ieee1394_transactions.h | |||
| @@ -19,8 +19,6 @@ struct hpsb_packet *hpsb_make_lock64packet(struct hpsb_host *host, | |||
| 19 | nodeid_t node, u64 addr, int extcode, | 19 | nodeid_t node, u64 addr, int extcode, |
| 20 | octlet_t *data, octlet_t arg); | 20 | octlet_t *data, octlet_t arg); |
| 21 | struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host, quadlet_t data); | 21 | struct hpsb_packet *hpsb_make_phypacket(struct hpsb_host *host, quadlet_t data); |
| 22 | struct hpsb_packet *hpsb_make_isopacket(struct hpsb_host *host, int length, | ||
| 23 | int channel, int tag, int sync); | ||
| 24 | struct hpsb_packet *hpsb_make_writepacket(struct hpsb_host *host, | 22 | struct hpsb_packet *hpsb_make_writepacket(struct hpsb_host *host, |
| 25 | nodeid_t node, u64 addr, | 23 | nodeid_t node, u64 addr, |
| 26 | quadlet_t *buffer, size_t length); | 24 | quadlet_t *buffer, size_t length); |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index a75b1446b6e..5667c8102ef 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
| @@ -157,7 +157,6 @@ static void dma_trm_reset(struct dma_trm_ctx *d); | |||
| 157 | static int alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | 157 | static int alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, |
| 158 | enum context_type type, int ctx, int num_desc, | 158 | enum context_type type, int ctx, int num_desc, |
| 159 | int buf_size, int split_buf_size, int context_base); | 159 | int buf_size, int split_buf_size, int context_base); |
| 160 | static void stop_dma_rcv_ctx(struct dma_rcv_ctx *d); | ||
| 161 | static void free_dma_rcv_ctx(struct dma_rcv_ctx *d); | 160 | static void free_dma_rcv_ctx(struct dma_rcv_ctx *d); |
| 162 | 161 | ||
| 163 | static int alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d, | 162 | static int alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d, |
| @@ -520,9 +519,6 @@ static void ohci_initialize(struct ti_ohci *ohci) | |||
| 520 | initialize_dma_trm_ctx(&ohci->at_req_context); | 519 | initialize_dma_trm_ctx(&ohci->at_req_context); |
| 521 | initialize_dma_trm_ctx(&ohci->at_resp_context); | 520 | initialize_dma_trm_ctx(&ohci->at_resp_context); |
| 522 | 521 | ||
| 523 | /* Initialize IR Legacy DMA channel mask */ | ||
| 524 | ohci->ir_legacy_channels = 0; | ||
| 525 | |||
| 526 | /* Accept AR requests from all nodes */ | 522 | /* Accept AR requests from all nodes */ |
| 527 | reg_write(ohci, OHCI1394_AsReqFilterHiSet, 0x80000000); | 523 | reg_write(ohci, OHCI1394_AsReqFilterHiSet, 0x80000000); |
| 528 | 524 | ||
| @@ -869,36 +865,9 @@ static int ohci_transmit(struct hpsb_host *host, struct hpsb_packet *packet) | |||
| 869 | return -EOVERFLOW; | 865 | return -EOVERFLOW; |
| 870 | } | 866 | } |
| 871 | 867 | ||
| 872 | /* Decide whether we have an iso, a request, or a response packet */ | ||
| 873 | if (packet->type == hpsb_raw) | 868 | if (packet->type == hpsb_raw) |
| 874 | d = &ohci->at_req_context; | 869 | d = &ohci->at_req_context; |
| 875 | else if ((packet->tcode == TCODE_ISO_DATA) && (packet->type == hpsb_iso)) { | 870 | else if ((packet->tcode & 0x02) && (packet->tcode != TCODE_ISO_DATA)) |
| 876 | /* The legacy IT DMA context is initialized on first | ||
| 877 | * use. However, the alloc cannot be run from | ||
| 878 | * interrupt context, so we bail out if that is the | ||
| 879 | * case. I don't see anyone sending ISO packets from | ||
| 880 | * interrupt context anyway... */ | ||
| 881 | |||
| 882 | if (ohci->it_legacy_context.ohci == NULL) { | ||
| 883 | if (in_interrupt()) { | ||
| 884 | PRINT(KERN_ERR, | ||
| 885 | "legacy IT context cannot be initialized during interrupt"); | ||
| 886 | return -EINVAL; | ||
| 887 | } | ||
| 888 | |||
| 889 | if (alloc_dma_trm_ctx(ohci, &ohci->it_legacy_context, | ||
| 890 | DMA_CTX_ISO, 0, IT_NUM_DESC, | ||
| 891 | OHCI1394_IsoXmitContextBase) < 0) { | ||
| 892 | PRINT(KERN_ERR, | ||
| 893 | "error initializing legacy IT context"); | ||
| 894 | return -ENOMEM; | ||
| 895 | } | ||
| 896 | |||
| 897 | initialize_dma_trm_ctx(&ohci->it_legacy_context); | ||
| 898 | } | ||
| 899 | |||
| 900 | d = &ohci->it_legacy_context; | ||
| 901 | } else if ((packet->tcode & 0x02) && (packet->tcode != TCODE_ISO_DATA)) | ||
| 902 | d = &ohci->at_resp_context; | 871 | d = &ohci->at_resp_context; |
| 903 | else | 872 | else |
| 904 | d = &ohci->at_req_context; | 873 | d = &ohci->at_req_context; |
| @@ -917,9 +886,7 @@ static int ohci_transmit(struct hpsb_host *host, struct hpsb_packet *packet) | |||
| 917 | static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) | 886 | static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) |
| 918 | { | 887 | { |
| 919 | struct ti_ohci *ohci = host->hostdata; | 888 | struct ti_ohci *ohci = host->hostdata; |
| 920 | int retval = 0; | 889 | int retval = 0, phy_reg; |
| 921 | unsigned long flags; | ||
| 922 | int phy_reg; | ||
| 923 | 890 | ||
| 924 | switch (cmd) { | 891 | switch (cmd) { |
| 925 | case RESET_BUS: | 892 | case RESET_BUS: |
| @@ -1012,117 +979,6 @@ static int ohci_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) | |||
| 1012 | dma_trm_reset(&ohci->at_resp_context); | 979 | dma_trm_reset(&ohci->at_resp_context); |
| 1013 | break; | 980 | break; |
| 1014 | 981 | ||
| 1015 | case ISO_LISTEN_CHANNEL: | ||
| 1016 | { | ||
| 1017 | u64 mask; | ||
| 1018 | struct dma_rcv_ctx *d = &ohci->ir_legacy_context; | ||
| 1019 | int ir_legacy_active; | ||
| 1020 | |||
| 1021 | if (arg<0 || arg>63) { | ||
| 1022 | PRINT(KERN_ERR, | ||
| 1023 | "%s: IS0 listen channel %d is out of range", | ||
| 1024 | __FUNCTION__, arg); | ||
| 1025 | return -EFAULT; | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | mask = (u64)0x1<<arg; | ||
| 1029 | |||
| 1030 | spin_lock_irqsave(&ohci->IR_channel_lock, flags); | ||
| 1031 | |||
| 1032 | if (ohci->ISO_channel_usage & mask) { | ||
| 1033 | PRINT(KERN_ERR, | ||
| 1034 | "%s: IS0 listen channel %d is already used", | ||
| 1035 | __FUNCTION__, arg); | ||
| 1036 | spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); | ||
| 1037 | return -EFAULT; | ||
| 1038 | } | ||
| 1039 | |||
| 1040 | ir_legacy_active = ohci->ir_legacy_channels; | ||
| 1041 | |||
| 1042 | ohci->ISO_channel_usage |= mask; | ||
| 1043 | ohci->ir_legacy_channels |= mask; | ||
| 1044 | |||
| 1045 | spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); | ||
| 1046 | |||
| 1047 | if (!ir_legacy_active) { | ||
| 1048 | if (ohci1394_register_iso_tasklet(ohci, | ||
| 1049 | &ohci->ir_legacy_tasklet) < 0) { | ||
| 1050 | PRINT(KERN_ERR, "No IR DMA context available"); | ||
| 1051 | return -EBUSY; | ||
| 1052 | } | ||
| 1053 | |||
| 1054 | /* the IR context can be assigned to any DMA context | ||
| 1055 | * by ohci1394_register_iso_tasklet */ | ||
| 1056 | d->ctx = ohci->ir_legacy_tasklet.context; | ||
| 1057 | d->ctrlSet = OHCI1394_IsoRcvContextControlSet + | ||
| 1058 | 32*d->ctx; | ||
| 1059 | d->ctrlClear = OHCI1394_IsoRcvContextControlClear + | ||
| 1060 | 32*d->ctx; | ||
| 1061 | d->cmdPtr = OHCI1394_IsoRcvCommandPtr + 32*d->ctx; | ||
| 1062 | d->ctxtMatch = OHCI1394_IsoRcvContextMatch + 32*d->ctx; | ||
| 1063 | |||
| 1064 | initialize_dma_rcv_ctx(&ohci->ir_legacy_context, 1); | ||
| 1065 | |||
| 1066 | if (printk_ratelimit()) | ||
| 1067 | DBGMSG("IR legacy activated"); | ||
| 1068 | } | ||
| 1069 | |||
| 1070 | spin_lock_irqsave(&ohci->IR_channel_lock, flags); | ||
| 1071 | |||
| 1072 | if (arg>31) | ||
| 1073 | reg_write(ohci, OHCI1394_IRMultiChanMaskHiSet, | ||
| 1074 | 1<<(arg-32)); | ||
| 1075 | else | ||
| 1076 | reg_write(ohci, OHCI1394_IRMultiChanMaskLoSet, | ||
| 1077 | 1<<arg); | ||
| 1078 | |||
| 1079 | spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); | ||
| 1080 | DBGMSG("Listening enabled on channel %d", arg); | ||
| 1081 | break; | ||
| 1082 | } | ||
| 1083 | case ISO_UNLISTEN_CHANNEL: | ||
| 1084 | { | ||
| 1085 | u64 mask; | ||
| 1086 | |||
| 1087 | if (arg<0 || arg>63) { | ||
| 1088 | PRINT(KERN_ERR, | ||
| 1089 | "%s: IS0 unlisten channel %d is out of range", | ||
| 1090 | __FUNCTION__, arg); | ||
| 1091 | return -EFAULT; | ||
| 1092 | } | ||
| 1093 | |||
| 1094 | mask = (u64)0x1<<arg; | ||
| 1095 | |||
| 1096 | spin_lock_irqsave(&ohci->IR_channel_lock, flags); | ||
| 1097 | |||
| 1098 | if (!(ohci->ISO_channel_usage & mask)) { | ||
| 1099 | PRINT(KERN_ERR, | ||
| 1100 | "%s: IS0 unlisten channel %d is not used", | ||
| 1101 | __FUNCTION__, arg); | ||
| 1102 | spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); | ||
| 1103 | return -EFAULT; | ||
| 1104 | } | ||
| 1105 | |||
| 1106 | ohci->ISO_channel_usage &= ~mask; | ||
| 1107 | ohci->ir_legacy_channels &= ~mask; | ||
| 1108 | |||
| 1109 | if (arg>31) | ||
| 1110 | reg_write(ohci, OHCI1394_IRMultiChanMaskHiClear, | ||
| 1111 | 1<<(arg-32)); | ||
| 1112 | else | ||
| 1113 | reg_write(ohci, OHCI1394_IRMultiChanMaskLoClear, | ||
| 1114 | 1<<arg); | ||
| 1115 | |||
| 1116 | spin_unlock_irqrestore(&ohci->IR_channel_lock, flags); | ||
| 1117 | DBGMSG("Listening disabled on channel %d", arg); | ||
| 1118 | |||
| 1119 | if (ohci->ir_legacy_channels == 0) { | ||
| 1120 | stop_dma_rcv_ctx(&ohci->ir_legacy_context); | ||
| 1121 | DBGMSG("ISO legacy receive context stopped"); | ||
| 1122 | } | ||
| 1123 | |||
| 1124 | break; | ||
| 1125 | } | ||
| 1126 | default: | 982 | default: |
| 1127 | PRINT_G(KERN_ERR, "ohci_devctl cmd %d not implemented yet", | 983 | PRINT_G(KERN_ERR, "ohci_devctl cmd %d not implemented yet", |
| 1128 | cmd); | 984 | cmd); |
| @@ -2868,22 +2724,6 @@ static void dma_trm_tasklet (unsigned long data) | |||
| 2868 | spin_unlock_irqrestore(&d->lock, flags); | 2724 | spin_unlock_irqrestore(&d->lock, flags); |
| 2869 | } | 2725 | } |
| 2870 | 2726 | ||
| 2871 | static void stop_dma_rcv_ctx(struct dma_rcv_ctx *d) | ||
| 2872 | { | ||
| 2873 | if (d->ctrlClear) { | ||
| 2874 | ohci1394_stop_context(d->ohci, d->ctrlClear, NULL); | ||
| 2875 | |||
| 2876 | if (d->type == DMA_CTX_ISO) { | ||
| 2877 | /* disable interrupts */ | ||
| 2878 | reg_write(d->ohci, OHCI1394_IsoRecvIntMaskClear, 1 << d->ctx); | ||
| 2879 | ohci1394_unregister_iso_tasklet(d->ohci, &d->ohci->ir_legacy_tasklet); | ||
| 2880 | } else { | ||
| 2881 | tasklet_kill(&d->task); | ||
| 2882 | } | ||
| 2883 | } | ||
| 2884 | } | ||
| 2885 | |||
| 2886 | |||
| 2887 | static void free_dma_rcv_ctx(struct dma_rcv_ctx *d) | 2727 | static void free_dma_rcv_ctx(struct dma_rcv_ctx *d) |
| 2888 | { | 2728 | { |
| 2889 | int i; | 2729 | int i; |
| @@ -3005,18 +2845,11 @@ alloc_dma_rcv_ctx(struct ti_ohci *ohci, struct dma_rcv_ctx *d, | |||
| 3005 | 2845 | ||
| 3006 | spin_lock_init(&d->lock); | 2846 | spin_lock_init(&d->lock); |
| 3007 | 2847 | ||
| 3008 | if (type == DMA_CTX_ISO) { | 2848 | d->ctrlSet = context_base + OHCI1394_ContextControlSet; |
| 3009 | ohci1394_init_iso_tasklet(&ohci->ir_legacy_tasklet, | 2849 | d->ctrlClear = context_base + OHCI1394_ContextControlClear; |
| 3010 | OHCI_ISO_MULTICHANNEL_RECEIVE, | 2850 | d->cmdPtr = context_base + OHCI1394_ContextCommandPtr; |
| 3011 | dma_rcv_tasklet, (unsigned long) d); | ||
| 3012 | } else { | ||
| 3013 | d->ctrlSet = context_base + OHCI1394_ContextControlSet; | ||
| 3014 | d->ctrlClear = context_base + OHCI1394_ContextControlClear; | ||
| 3015 | d->cmdPtr = context_base + OHCI1394_ContextCommandPtr; | ||
| 3016 | |||
| 3017 | tasklet_init (&d->task, dma_rcv_tasklet, (unsigned long) d); | ||
| 3018 | } | ||
| 3019 | 2851 | ||
| 2852 | tasklet_init(&d->task, dma_rcv_tasklet, (unsigned long) d); | ||
| 3020 | return 0; | 2853 | return 0; |
| 3021 | } | 2854 | } |
| 3022 | 2855 | ||
| @@ -3097,28 +2930,10 @@ alloc_dma_trm_ctx(struct ti_ohci *ohci, struct dma_trm_ctx *d, | |||
| 3097 | spin_lock_init(&d->lock); | 2930 | spin_lock_init(&d->lock); |
| 3098 | 2931 | ||
| 3099 | /* initialize tasklet */ | 2932 | /* initialize tasklet */ |
| 3100 | if (type == DMA_CTX_ISO) { | 2933 | d->ctrlSet = context_base + OHCI1394_ContextControlSet; |
| 3101 | ohci1394_init_iso_tasklet(&ohci->it_legacy_tasklet, OHCI_ISO_TRANSMIT, | 2934 | d->ctrlClear = context_base + OHCI1394_ContextControlClear; |
| 3102 | dma_trm_tasklet, (unsigned long) d); | 2935 | d->cmdPtr = context_base + OHCI1394_ContextCommandPtr; |
| 3103 | if (ohci1394_register_iso_tasklet(ohci, | 2936 | tasklet_init(&d->task, dma_trm_tasklet, (unsigned long)d); |
| 3104 | &ohci->it_legacy_tasklet) < 0) { | ||
| 3105 | PRINT(KERN_ERR, "No IT DMA context available"); | ||
| 3106 | free_dma_trm_ctx(d); | ||
| 3107 | return -EBUSY; | ||
| 3108 | } | ||
| 3109 | |||
| 3110 | /* IT can be assigned to any context by register_iso_tasklet */ | ||
| 3111 | d->ctx = ohci->it_legacy_tasklet.context; | ||
| 3112 | d->ctrlSet = OHCI1394_IsoXmitContextControlSet + 16 * d->ctx; | ||
| 3113 | d->ctrlClear = OHCI1394_IsoXmitContextControlClear + 16 * d->ctx; | ||
| 3114 | d->cmdPtr = OHCI1394_IsoXmitCommandPtr + 16 * d->ctx; | ||
| 3115 | } else { | ||
| 3116 | d->ctrlSet = context_base + OHCI1394_ContextControlSet; | ||
| 3117 | d->ctrlClear = context_base + OHCI1394_ContextControlClear; | ||
| 3118 | d->cmdPtr = context_base + OHCI1394_ContextCommandPtr; | ||
| 3119 | tasklet_init (&d->task, dma_trm_tasklet, (unsigned long)d); | ||
| 3120 | } | ||
| 3121 | |||
| 3122 | return 0; | 2937 | return 0; |
| 3123 | } | 2938 | } |
| 3124 | 2939 | ||
| @@ -3344,20 +3159,6 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev, | |||
| 3344 | ohci->ISO_channel_usage = 0; | 3159 | ohci->ISO_channel_usage = 0; |
| 3345 | spin_lock_init(&ohci->IR_channel_lock); | 3160 | spin_lock_init(&ohci->IR_channel_lock); |
| 3346 | 3161 | ||
| 3347 | /* Allocate the IR DMA context right here so we don't have | ||
| 3348 | * to do it in interrupt path - note that this doesn't | ||
| 3349 | * waste much memory and avoids the jugglery required to | ||
| 3350 | * allocate it in IRQ path. */ | ||
| 3351 | if (alloc_dma_rcv_ctx(ohci, &ohci->ir_legacy_context, | ||
| 3352 | DMA_CTX_ISO, 0, IR_NUM_DESC, | ||
| 3353 | IR_BUF_SIZE, IR_SPLIT_BUF_SIZE, | ||
| 3354 | OHCI1394_IsoRcvContextBase) < 0) { | ||
| 3355 | FAIL(-ENOMEM, "Cannot allocate IR Legacy DMA context"); | ||
| 3356 | } | ||
| 3357 | |||
| 3358 | /* We hopefully don't have to pre-allocate IT DMA like we did | ||
| 3359 | * for IR DMA above. Allocate it on-demand and mark inactive. */ | ||
| 3360 | ohci->it_legacy_context.ohci = NULL; | ||
| 3361 | spin_lock_init(&ohci->event_lock); | 3162 | spin_lock_init(&ohci->event_lock); |
| 3362 | 3163 | ||
| 3363 | /* | 3164 | /* |
| @@ -3450,8 +3251,6 @@ static void ohci1394_pci_remove(struct pci_dev *pdev) | |||
| 3450 | free_dma_rcv_ctx(&ohci->ar_resp_context); | 3251 | free_dma_rcv_ctx(&ohci->ar_resp_context); |
| 3451 | free_dma_trm_ctx(&ohci->at_req_context); | 3252 | free_dma_trm_ctx(&ohci->at_req_context); |
| 3452 | free_dma_trm_ctx(&ohci->at_resp_context); | 3253 | free_dma_trm_ctx(&ohci->at_resp_context); |
| 3453 | free_dma_rcv_ctx(&ohci->ir_legacy_context); | ||
| 3454 | free_dma_trm_ctx(&ohci->it_legacy_context); | ||
| 3455 | 3254 | ||
| 3456 | case OHCI_INIT_HAVE_SELFID_BUFFER: | 3255 | case OHCI_INIT_HAVE_SELFID_BUFFER: |
| 3457 | pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, | 3256 | pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, |
diff --git a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h index f1ad539e7c1..4320bf01049 100644 --- a/drivers/ieee1394/ohci1394.h +++ b/drivers/ieee1394/ohci1394.h | |||
| @@ -190,23 +190,10 @@ struct ti_ohci { | |||
| 190 | unsigned long ir_multichannel_used; /* ditto */ | 190 | unsigned long ir_multichannel_used; /* ditto */ |
| 191 | spinlock_t IR_channel_lock; | 191 | spinlock_t IR_channel_lock; |
| 192 | 192 | ||
| 193 | /* iso receive (legacy API) */ | ||
| 194 | u64 ir_legacy_channels; /* note: this differs from ISO_channel_usage; | ||
| 195 | it only accounts for channels listened to | ||
| 196 | by the legacy API, so that we can know when | ||
| 197 | it is safe to free the legacy API context */ | ||
| 198 | |||
| 199 | struct dma_rcv_ctx ir_legacy_context; | ||
| 200 | struct ohci1394_iso_tasklet ir_legacy_tasklet; | ||
| 201 | |||
| 202 | /* iso transmit */ | 193 | /* iso transmit */ |
| 203 | int nb_iso_xmit_ctx; | 194 | int nb_iso_xmit_ctx; |
| 204 | unsigned long it_ctx_usage; /* use test_and_set_bit() for atomicity */ | 195 | unsigned long it_ctx_usage; /* use test_and_set_bit() for atomicity */ |
| 205 | 196 | ||
| 206 | /* iso transmit (legacy API) */ | ||
| 207 | struct dma_trm_ctx it_legacy_context; | ||
| 208 | struct ohci1394_iso_tasklet it_legacy_tasklet; | ||
| 209 | |||
| 210 | u64 ISO_channel_usage; | 197 | u64 ISO_channel_usage; |
| 211 | 198 | ||
| 212 | /* IEEE-1394 part follows */ | 199 | /* IEEE-1394 part follows */ |
| @@ -221,7 +208,6 @@ struct ti_ohci { | |||
| 221 | 208 | ||
| 222 | /* Tasklets for iso receive and transmit, used by video1394 | 209 | /* Tasklets for iso receive and transmit, used by video1394 |
| 223 | * and dv1394 */ | 210 | * and dv1394 */ |
| 224 | |||
| 225 | struct list_head iso_tasklet_list; | 211 | struct list_head iso_tasklet_list; |
| 226 | spinlock_t iso_tasklet_list_lock; | 212 | spinlock_t iso_tasklet_list_lock; |
| 227 | 213 | ||
diff --git a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c index 0742befe922..d1a5bcdb5e0 100644 --- a/drivers/ieee1394/pcilynx.c +++ b/drivers/ieee1394/pcilynx.c | |||
| @@ -477,7 +477,11 @@ static void send_next(struct ti_lynx *lynx, int what) | |||
| 477 | struct lynx_send_data *d; | 477 | struct lynx_send_data *d; |
| 478 | struct hpsb_packet *packet; | 478 | struct hpsb_packet *packet; |
| 479 | 479 | ||
| 480 | #if 0 /* has been removed from ieee1394 core */ | ||
| 480 | d = (what == hpsb_iso ? &lynx->iso_send : &lynx->async); | 481 | d = (what == hpsb_iso ? &lynx->iso_send : &lynx->async); |
| 482 | #else | ||
| 483 | d = &lynx->async; | ||
| 484 | #endif | ||
| 481 | if (!list_empty(&d->pcl_queue)) { | 485 | if (!list_empty(&d->pcl_queue)) { |
| 482 | PRINT(KERN_ERR, lynx->id, "trying to queue a new packet in nonempty fifo"); | 486 | PRINT(KERN_ERR, lynx->id, "trying to queue a new packet in nonempty fifo"); |
| 483 | BUG(); | 487 | BUG(); |
| @@ -511,9 +515,11 @@ static void send_next(struct ti_lynx *lynx, int what) | |||
| 511 | case hpsb_async: | 515 | case hpsb_async: |
| 512 | pcl.buffer[0].control |= PCL_CMD_XMT; | 516 | pcl.buffer[0].control |= PCL_CMD_XMT; |
| 513 | break; | 517 | break; |
| 518 | #if 0 /* has been removed from ieee1394 core */ | ||
| 514 | case hpsb_iso: | 519 | case hpsb_iso: |
| 515 | pcl.buffer[0].control |= PCL_CMD_XMT | PCL_ISOMODE; | 520 | pcl.buffer[0].control |= PCL_CMD_XMT | PCL_ISOMODE; |
| 516 | break; | 521 | break; |
| 522 | #endif | ||
| 517 | case hpsb_raw: | 523 | case hpsb_raw: |
| 518 | pcl.buffer[0].control |= PCL_CMD_UNFXMT; | 524 | pcl.buffer[0].control |= PCL_CMD_UNFXMT; |
| 519 | break; | 525 | break; |
| @@ -542,9 +548,11 @@ static int lynx_transmit(struct hpsb_host *host, struct hpsb_packet *packet) | |||
| 542 | case hpsb_raw: | 548 | case hpsb_raw: |
| 543 | d = &lynx->async; | 549 | d = &lynx->async; |
| 544 | break; | 550 | break; |
| 551 | #if 0 /* has been removed from ieee1394 core */ | ||
| 545 | case hpsb_iso: | 552 | case hpsb_iso: |
| 546 | d = &lynx->iso_send; | 553 | d = &lynx->iso_send; |
| 547 | break; | 554 | break; |
| 555 | #endif | ||
| 548 | default: | 556 | default: |
| 549 | PRINT(KERN_ERR, lynx->id, "invalid packet type %d", | 557 | PRINT(KERN_ERR, lynx->id, "invalid packet type %d", |
| 550 | packet->type); | 558 | packet->type); |
| @@ -797,7 +805,7 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) | |||
| 797 | } | 805 | } |
| 798 | 806 | ||
| 799 | break; | 807 | break; |
| 800 | 808 | #if 0 /* has been removed from ieee1394 core */ | |
| 801 | case ISO_LISTEN_CHANNEL: | 809 | case ISO_LISTEN_CHANNEL: |
| 802 | spin_lock_irqsave(&lynx->iso_rcv.lock, flags); | 810 | spin_lock_irqsave(&lynx->iso_rcv.lock, flags); |
| 803 | 811 | ||
| @@ -819,7 +827,7 @@ static int lynx_devctl(struct hpsb_host *host, enum devctl_cmd cmd, int arg) | |||
| 819 | 827 | ||
| 820 | spin_unlock_irqrestore(&lynx->iso_rcv.lock, flags); | 828 | spin_unlock_irqrestore(&lynx->iso_rcv.lock, flags); |
| 821 | break; | 829 | break; |
| 822 | 830 | #endif | |
| 823 | default: | 831 | default: |
| 824 | PRINT(KERN_ERR, lynx->id, "unknown devctl command %d", cmd); | 832 | PRINT(KERN_ERR, lynx->id, "unknown devctl command %d", cmd); |
| 825 | retval = -1; | 833 | retval = -1; |
| @@ -1009,11 +1017,11 @@ static irqreturn_t lynx_irq_handler(int irq, void *dev_id) | |||
| 1009 | pci_unmap_single(lynx->dev, lynx->iso_send.data_dma, | 1017 | pci_unmap_single(lynx->dev, lynx->iso_send.data_dma, |
| 1010 | packet->data_size, PCI_DMA_TODEVICE); | 1018 | packet->data_size, PCI_DMA_TODEVICE); |
| 1011 | } | 1019 | } |
| 1012 | 1020 | #if 0 /* has been removed from ieee1394 core */ | |
| 1013 | if (!list_empty(&lynx->iso_send.queue)) { | 1021 | if (!list_empty(&lynx->iso_send.queue)) { |
| 1014 | send_next(lynx, hpsb_iso); | 1022 | send_next(lynx, hpsb_iso); |
| 1015 | } | 1023 | } |
| 1016 | 1024 | #endif | |
| 1017 | spin_unlock(&lynx->iso_send.queue_lock); | 1025 | spin_unlock(&lynx->iso_send.queue_lock); |
| 1018 | 1026 | ||
| 1019 | if (pcl.pcl_status & DMA_CHAN_STAT_PKTCMPL) { | 1027 | if (pcl.pcl_status & DMA_CHAN_STAT_PKTCMPL) { |
diff --git a/drivers/ieee1394/raw1394-private.h b/drivers/ieee1394/raw1394-private.h index 50daabf6e5f..a06aaad5b44 100644 --- a/drivers/ieee1394/raw1394-private.h +++ b/drivers/ieee1394/raw1394-private.h | |||
| @@ -36,11 +36,6 @@ struct file_info { | |||
| 36 | 36 | ||
| 37 | u8 __user *fcp_buffer; | 37 | u8 __user *fcp_buffer; |
| 38 | 38 | ||
| 39 | /* old ISO API */ | ||
| 40 | u64 listen_channels; | ||
| 41 | quadlet_t __user *iso_buffer; | ||
| 42 | size_t iso_buffer_length; | ||
| 43 | |||
| 44 | u8 notification; /* (busreset-notification) RAW1394_NOTIFY_OFF/ON */ | 39 | u8 notification; /* (busreset-notification) RAW1394_NOTIFY_OFF/ON */ |
| 45 | 40 | ||
| 46 | /* new rawiso API */ | 41 | /* new rawiso API */ |
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c index 1dadd5a15ba..336e5ff4cfc 100644 --- a/drivers/ieee1394/raw1394.c +++ b/drivers/ieee1394/raw1394.c | |||
| @@ -98,21 +98,6 @@ static struct hpsb_address_ops arm_ops = { | |||
| 98 | 98 | ||
| 99 | static void queue_complete_cb(struct pending_request *req); | 99 | static void queue_complete_cb(struct pending_request *req); |
| 100 | 100 | ||
| 101 | #include <asm/current.h> | ||
| 102 | static void print_old_iso_deprecation(void) | ||
| 103 | { | ||
| 104 | static pid_t p; | ||
| 105 | |||
| 106 | if (p == current->pid) | ||
| 107 | return; | ||
| 108 | p = current->pid; | ||
| 109 | printk(KERN_WARNING "raw1394: WARNING - Program \"%s\" uses unsupported" | ||
| 110 | " isochronous request types which will be removed in a next" | ||
| 111 | " kernel release\n", current->comm); | ||
| 112 | printk(KERN_WARNING "raw1394: Update your software to use libraw1394's" | ||
| 113 | " newer interface\n"); | ||
| 114 | } | ||
| 115 | |||
| 116 | static struct pending_request *__alloc_pending_request(gfp_t flags) | 101 | static struct pending_request *__alloc_pending_request(gfp_t flags) |
| 117 | { | 102 | { |
| 118 | struct pending_request *req; | 103 | struct pending_request *req; |
| @@ -297,67 +282,6 @@ static void host_reset(struct hpsb_host *host) | |||
| 297 | spin_unlock_irqrestore(&host_info_lock, flags); | 282 | spin_unlock_irqrestore(&host_info_lock, flags); |
| 298 | } | 283 | } |
| 299 | 284 | ||
| 300 | static void iso_receive(struct hpsb_host *host, int channel, quadlet_t * data, | ||
| 301 | size_t length) | ||
| 302 | { | ||
| 303 | unsigned long flags; | ||
| 304 | struct host_info *hi; | ||
| 305 | struct file_info *fi; | ||
| 306 | struct pending_request *req, *req_next; | ||
| 307 | struct iso_block_store *ibs = NULL; | ||
| 308 | LIST_HEAD(reqs); | ||
| 309 | |||
| 310 | if ((atomic_read(&iso_buffer_size) + length) > iso_buffer_max) { | ||
| 311 | HPSB_INFO("dropped iso packet"); | ||
| 312 | return; | ||
| 313 | } | ||
| 314 | |||
| 315 | spin_lock_irqsave(&host_info_lock, flags); | ||
| 316 | hi = find_host_info(host); | ||
| 317 | |||
| 318 | if (hi != NULL) { | ||
| 319 | list_for_each_entry(fi, &hi->file_info_list, list) { | ||
| 320 | if (!(fi->listen_channels & (1ULL << channel))) | ||
| 321 | continue; | ||
| 322 | |||
| 323 | req = __alloc_pending_request(GFP_ATOMIC); | ||
| 324 | if (!req) | ||
| 325 | break; | ||
| 326 | |||
| 327 | if (!ibs) { | ||
| 328 | ibs = kmalloc(sizeof(*ibs) + length, | ||
| 329 | GFP_ATOMIC); | ||
| 330 | if (!ibs) { | ||
| 331 | kfree(req); | ||
| 332 | break; | ||
| 333 | } | ||
| 334 | |||
| 335 | atomic_add(length, &iso_buffer_size); | ||
| 336 | atomic_set(&ibs->refcount, 0); | ||
| 337 | ibs->data_size = length; | ||
| 338 | memcpy(ibs->data, data, length); | ||
| 339 | } | ||
| 340 | |||
| 341 | atomic_inc(&ibs->refcount); | ||
| 342 | |||
| 343 | req->file_info = fi; | ||
| 344 | req->ibs = ibs; | ||
| 345 | req->data = ibs->data; | ||
| 346 | req->req.type = RAW1394_REQ_ISO_RECEIVE; | ||
| 347 | req->req.generation = get_hpsb_generation(host); | ||
| 348 | req->req.misc = 0; | ||
| 349 | req->req.recvb = ptr2int(fi->iso_buffer); | ||
| 350 | req->req.length = min(length, fi->iso_buffer_length); | ||
| 351 | |||
| 352 | list_add_tail(&req->list, &reqs); | ||
| 353 | } | ||
| 354 | } | ||
| 355 | spin_unlock_irqrestore(&host_info_lock, flags); | ||
| 356 | |||
| 357 | list_for_each_entry_safe(req, req_next, &reqs, list) | ||
| 358 | queue_complete_req(req); | ||
| 359 | } | ||
| 360 | |||
| 361 | static void fcp_request(struct hpsb_host *host, int nodeid, int direction, | 285 | static void fcp_request(struct hpsb_host *host, int nodeid, int direction, |
| 362 | int cts, u8 * data, size_t length) | 286 | int cts, u8 * data, size_t length) |
| 363 | { | 287 | { |
| @@ -680,43 +604,6 @@ out_set_card: | |||
| 680 | return 0; | 604 | return 0; |
| 681 | } | 605 | } |
| 682 | 606 | ||
| 683 | static void handle_iso_listen(struct file_info *fi, struct pending_request *req) | ||
| 684 | { | ||
| 685 | int channel = req->req.misc; | ||
| 686 | |||
| 687 | if ((channel > 63) || (channel < -64)) { | ||
| 688 | req->req.error = RAW1394_ERROR_INVALID_ARG; | ||
| 689 | } else if (channel >= 0) { | ||
| 690 | /* allocate channel req.misc */ | ||
| 691 | if (fi->listen_channels & (1ULL << channel)) { | ||
| 692 | req->req.error = RAW1394_ERROR_ALREADY; | ||
| 693 | } else { | ||
| 694 | if (hpsb_listen_channel | ||
| 695 | (&raw1394_highlevel, fi->host, channel)) { | ||
| 696 | req->req.error = RAW1394_ERROR_ALREADY; | ||
| 697 | } else { | ||
| 698 | fi->listen_channels |= 1ULL << channel; | ||
| 699 | fi->iso_buffer = int2ptr(req->req.recvb); | ||
| 700 | fi->iso_buffer_length = req->req.length; | ||
| 701 | } | ||
| 702 | } | ||
| 703 | } else { | ||
| 704 | /* deallocate channel (one's complement neg) req.misc */ | ||
| 705 | channel = ~channel; | ||
| 706 | |||
| 707 | if (fi->listen_channels & (1ULL << channel)) { | ||
| 708 | hpsb_unlisten_channel(&raw1394_highlevel, fi->host, | ||
| 709 | channel); | ||
| 710 | fi->listen_channels &= ~(1ULL << channel); | ||
| 711 | } else { | ||
| 712 | req->req.error = RAW1394_ERROR_INVALID_ARG; | ||
| 713 | } | ||
| 714 | } | ||
| 715 | |||
| 716 | req->req.length = 0; | ||
| 717 | queue_complete_req(req); | ||
| 718 | } | ||
| 719 | |||
| 720 | static void handle_fcp_listen(struct file_info *fi, struct pending_request *req) | 607 | static void handle_fcp_listen(struct file_info *fi, struct pending_request *req) |
| 721 | { | 608 | { |
| 722 | if (req->req.misc) { | 609 | if (req->req.misc) { |
| @@ -890,50 +777,6 @@ static int handle_async_request(struct file_info *fi, | |||
| 890 | return 0; | 777 | return 0; |
| 891 | } | 778 | } |
| 892 | 779 | ||
| 893 | static int handle_iso_send(struct file_info *fi, struct pending_request *req, | ||
| 894 | int channel) | ||
| 895 | { | ||
| 896 | unsigned long flags; | ||
| 897 | struct hpsb_packet *packet; | ||
| 898 | |||
| 899 | packet = hpsb_make_isopacket(fi->host, req->req.length, channel & 0x3f, | ||
| 900 | (req->req.misc >> 16) & 0x3, | ||
| 901 | req->req.misc & 0xf); | ||
| 902 | if (!packet) | ||
| 903 | return -ENOMEM; | ||
| 904 | |||
| 905 | packet->speed_code = req->req.address & 0x3; | ||
| 906 | |||
| 907 | req->packet = packet; | ||
| 908 | |||
| 909 | if (copy_from_user(packet->data, int2ptr(req->req.sendb), | ||
| 910 | req->req.length)) { | ||
| 911 | req->req.error = RAW1394_ERROR_MEMFAULT; | ||
| 912 | req->req.length = 0; | ||
| 913 | queue_complete_req(req); | ||
| 914 | return 0; | ||
| 915 | } | ||
| 916 | |||
| 917 | req->req.length = 0; | ||
| 918 | hpsb_set_packet_complete_task(packet, | ||
| 919 | (void (*)(void *))queue_complete_req, | ||
| 920 | req); | ||
| 921 | |||
| 922 | spin_lock_irqsave(&fi->reqlists_lock, flags); | ||
| 923 | list_add_tail(&req->list, &fi->req_pending); | ||
| 924 | spin_unlock_irqrestore(&fi->reqlists_lock, flags); | ||
| 925 | |||
| 926 | /* Update the generation of the packet just before sending. */ | ||
| 927 | packet->generation = req->req.generation; | ||
| 928 | |||
| 929 | if (hpsb_send_packet(packet) < 0) { | ||
| 930 | req->req.error = RAW1394_ERROR_SEND_ERROR; | ||
| 931 | queue_complete_req(req); | ||
| 932 | } | ||
| 933 | |||
| 934 | return 0; | ||
| 935 | } | ||
| 936 | |||
| 937 | static int handle_async_send(struct file_info *fi, struct pending_request *req) | 780 | static int handle_async_send(struct file_info *fi, struct pending_request *req) |
| 938 | { | 781 | { |
| 939 | unsigned long flags; | 782 | unsigned long flags; |
| @@ -2317,10 +2160,6 @@ static int state_connected(struct file_info *fi, struct pending_request *req) | |||
| 2317 | queue_complete_req(req); | 2160 | queue_complete_req(req); |
| 2318 | return 0; | 2161 | return 0; |
| 2319 | 2162 | ||
| 2320 | case RAW1394_REQ_ISO_SEND: | ||
| 2321 | print_old_iso_deprecation(); | ||
| 2322 | return handle_iso_send(fi, req, node); | ||
| 2323 | |||
| 2324 | case RAW1394_REQ_ARM_REGISTER: | 2163 | case RAW1394_REQ_ARM_REGISTER: |
| 2325 | return arm_register(fi, req); | 2164 | return arm_register(fi, req); |
| 2326 | 2165 | ||
| @@ -2336,9 +2175,12 @@ static int state_connected(struct file_info *fi, struct pending_request *req) | |||
| 2336 | case RAW1394_REQ_RESET_NOTIFY: | 2175 | case RAW1394_REQ_RESET_NOTIFY: |
| 2337 | return reset_notification(fi, req); | 2176 | return reset_notification(fi, req); |
| 2338 | 2177 | ||
| 2178 | case RAW1394_REQ_ISO_SEND: | ||
| 2339 | case RAW1394_REQ_ISO_LISTEN: | 2179 | case RAW1394_REQ_ISO_LISTEN: |
| 2340 | print_old_iso_deprecation(); | 2180 | printk(KERN_DEBUG "raw1394: old iso ABI has been removed\n"); |
| 2341 | handle_iso_listen(fi, req); | 2181 | req->req.error = RAW1394_ERROR_COMPAT; |
| 2182 | req->req.misc = RAW1394_KERNELAPI_VERSION; | ||
| 2183 | queue_complete_req(req); | ||
| 2342 | return 0; | 2184 | return 0; |
| 2343 | 2185 | ||
| 2344 | case RAW1394_REQ_FCP_LISTEN: | 2186 | case RAW1394_REQ_FCP_LISTEN: |
| @@ -2965,14 +2807,7 @@ static int raw1394_release(struct inode *inode, struct file *file) | |||
| 2965 | if (fi->iso_state != RAW1394_ISO_INACTIVE) | 2807 | if (fi->iso_state != RAW1394_ISO_INACTIVE) |
| 2966 | raw1394_iso_shutdown(fi); | 2808 | raw1394_iso_shutdown(fi); |
| 2967 | 2809 | ||
| 2968 | for (i = 0; i < 64; i++) { | ||
| 2969 | if (fi->listen_channels & (1ULL << i)) { | ||
| 2970 | hpsb_unlisten_channel(&raw1394_highlevel, fi->host, i); | ||
| 2971 | } | ||
| 2972 | } | ||
| 2973 | |||
| 2974 | spin_lock_irqsave(&host_info_lock, flags); | 2810 | spin_lock_irqsave(&host_info_lock, flags); |
| 2975 | fi->listen_channels = 0; | ||
| 2976 | 2811 | ||
| 2977 | fail = 0; | 2812 | fail = 0; |
| 2978 | /* set address-entries invalid */ | 2813 | /* set address-entries invalid */ |
| @@ -3134,7 +2969,6 @@ static struct hpsb_highlevel raw1394_highlevel = { | |||
| 3134 | .add_host = add_host, | 2969 | .add_host = add_host, |
| 3135 | .remove_host = remove_host, | 2970 | .remove_host = remove_host, |
| 3136 | .host_reset = host_reset, | 2971 | .host_reset = host_reset, |
| 3137 | .iso_receive = iso_receive, | ||
| 3138 | .fcp_request = fcp_request, | 2972 | .fcp_request = fcp_request, |
| 3139 | }; | 2973 | }; |
| 3140 | 2974 | ||
diff --git a/drivers/ieee1394/raw1394.h b/drivers/ieee1394/raw1394.h index 7bd22ee1afb..963ac20373d 100644 --- a/drivers/ieee1394/raw1394.h +++ b/drivers/ieee1394/raw1394.h | |||
| @@ -17,11 +17,11 @@ | |||
| 17 | #define RAW1394_REQ_ASYNC_WRITE 101 | 17 | #define RAW1394_REQ_ASYNC_WRITE 101 |
| 18 | #define RAW1394_REQ_LOCK 102 | 18 | #define RAW1394_REQ_LOCK 102 |
| 19 | #define RAW1394_REQ_LOCK64 103 | 19 | #define RAW1394_REQ_LOCK64 103 |
| 20 | #define RAW1394_REQ_ISO_SEND 104 | 20 | #define RAW1394_REQ_ISO_SEND 104 /* removed ABI, now a no-op */ |
| 21 | #define RAW1394_REQ_ASYNC_SEND 105 | 21 | #define RAW1394_REQ_ASYNC_SEND 105 |
| 22 | #define RAW1394_REQ_ASYNC_STREAM 106 | 22 | #define RAW1394_REQ_ASYNC_STREAM 106 |
| 23 | 23 | ||
| 24 | #define RAW1394_REQ_ISO_LISTEN 200 | 24 | #define RAW1394_REQ_ISO_LISTEN 200 /* removed ABI, now a no-op */ |
| 25 | #define RAW1394_REQ_FCP_LISTEN 201 | 25 | #define RAW1394_REQ_FCP_LISTEN 201 |
| 26 | #define RAW1394_REQ_RESET_BUS 202 | 26 | #define RAW1394_REQ_RESET_BUS 202 |
| 27 | #define RAW1394_REQ_GET_ROM 203 | 27 | #define RAW1394_REQ_GET_ROM 203 |
