Commit 2fe2023a authored by Stefan Richter's avatar Stefan Richter

firewire: revert to 4 GB RDMA, fix protocols using Memory Space

Undo a feature introduced in v3.14 by commit fcd46b34
"firewire: Enable remote DMA above 4 GB".  That change raised the
minimum address at which protocol drivers and user programs can register
for request reception from 0x0001'0000'0000 to 0x8000'0000'0000.
It turned out that at least one vendor-specific protocol exists which
uses lower addresses:  https://bugzilla.kernel.org/show_bug.cgi?id=76921

For the time being, revert most of commit fcd46b34 so that affected
protocols work like with kernel v3.13 and before.  Just keep the valid
documentation parts from the regressing commit, and the ability to
identify controllers which could be programmed to accept >32 bit
physical DMA addresses.  The rest of fcd46b34 should probably be
brought back as an optional instead of default feature.
Reported-by: default avatarFabien Spindler <fabien.spindler@inria.fr>
Cc: <stable@vger.kernel.org> # 3.14+
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent c7208164
...@@ -25,9 +25,11 @@ using data transfer rates in the order of 10MB/s or more. ...@@ -25,9 +25,11 @@ using data transfer rates in the order of 10MB/s or more.
With most FireWire controllers, memory access is limited to the low 4 GB With most FireWire controllers, memory access is limited to the low 4 GB
of physical address space. This can be a problem on IA64 machines where of physical address space. This can be a problem on IA64 machines where
memory is located mostly above that limit, but it is rarely a problem on memory is located mostly above that limit, but it is rarely a problem on
more common hardware such as x86, x86-64 and PowerPC. However, at least more common hardware such as x86, x86-64 and PowerPC.
Agere/LSI FW643e and FW643e2 controllers are known to support access to
physical addresses above 4 GB. At least LSI FW643e and FW643e2 controllers are known to support access to
physical addresses above 4 GB, but this feature is currently not enabled by
Linux.
Together with a early initialization of the OHCI-1394 controller for debugging, Together with a early initialization of the OHCI-1394 controller for debugging,
this facility proved most useful for examining long debugs logs in the printk this facility proved most useful for examining long debugs logs in the printk
...@@ -101,8 +103,9 @@ Step-by-step instructions for using firescope with early OHCI initialization: ...@@ -101,8 +103,9 @@ Step-by-step instructions for using firescope with early OHCI initialization:
compliant, they are based on TI PCILynx chips and require drivers for Win- compliant, they are based on TI PCILynx chips and require drivers for Win-
dows operating systems. dows operating systems.
The mentioned kernel log message contains ">4 GB phys DMA" in case of The mentioned kernel log message contains the string "physUB" if the
OHCI-1394 controllers which support accesses above this limit. controller implements a writable Physical Upper Bound register. This is
required for physical DMA above 4 GB (but not utilized by Linux yet).
2) Establish a working FireWire cable connection: 2) Establish a working FireWire cable connection:
......
...@@ -237,8 +237,8 @@ static inline bool is_next_generation(int new_generation, int old_generation) ...@@ -237,8 +237,8 @@ static inline bool is_next_generation(int new_generation, int old_generation)
#define LOCAL_BUS 0xffc0 #define LOCAL_BUS 0xffc0
/* arbitrarily chosen maximum range for physical DMA: 128 TB */ /* OHCI-1394's default upper bound for physical DMA: 4 GB */
#define FW_MAX_PHYSICAL_RANGE (128ULL << 40) #define FW_MAX_PHYSICAL_RANGE (1ULL << 32)
void fw_core_handle_request(struct fw_card *card, struct fw_packet *request); void fw_core_handle_request(struct fw_card *card, struct fw_packet *request);
void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet); void fw_core_handle_response(struct fw_card *card, struct fw_packet *packet);
......
...@@ -3716,7 +3716,7 @@ static int pci_probe(struct pci_dev *dev, ...@@ -3716,7 +3716,7 @@ static int pci_probe(struct pci_dev *dev,
version >> 16, version & 0xff, ohci->card.index, version >> 16, version & 0xff, ohci->card.index,
ohci->n_ir, ohci->n_it, ohci->quirks, ohci->n_ir, ohci->n_it, ohci->quirks,
reg_read(ohci, OHCI1394_PhyUpperBound) ? reg_read(ohci, OHCI1394_PhyUpperBound) ?
", >4 GB phys DMA" : ""); ", physUB" : "");
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment